问题描述
我可以轻松地将结果日期进行透视,但是无法在周数中进行透视。
表结构exp。
CREATE TABLE `products` (
`product_name` varchar(250) DEFAULT NULL,`date` date DEFAULT NULL,`sales` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*Data for the table `products` */
insert into `products`(`product_name`,`date`,`sales`) values
('Micro','2020-08-01',100),('Micro','2020-08-02',200),('x',300),('y',('z','2020-08-03',400),'2020-08-10',500),'2020-08-11',230),210),240);
SET SESSION group_concat_max_len = 10000;
DROP TEMPORARY TABLE IF EXISTS temp_sale;
CREATE TEMPORARY TABLE temp_sale
SELECT `date`,product_name,SUM(sales) AS sales FROM
products
WHERE DATE BETWEEN DATE_ADD("2020-08-12",INTERVAL -29 DAY) AND "2020-08-12"
GROUP BY `date`,product_name;
SELECT * FROM temp_sale;
// this code is used to get the result on date wise pivot
SET @sql = NULL;
SELECT
GROUP_CONCAT(disTINCT
CONCAT(
'max(CASE WHEN date = ''',DATE_FORMAT(DATE,'%Y-%m-%d'),''' THEN round(sales,2) end) AS `','`'
)
) INTO @sql
FROM `temp_sale` WHERE DATE BETWEEN DATE_ADD("2020-08-12",INTERVAL -29 DAY) AND "2020-08-12" ;
SET @final_query = CONCAT('select product_name,',@sql,' from temp_sale
group by product_name');
PREPARE stmt FROM @final_query;
EXECUTE stmt;
但是问题是我需要按周汇总销售记录的总和。就像
Product_name | sales | week-31 | week- 32 | week- 33
请在此处帮助按周动态动态显示数据。
解决方法
此数据透视表无需临时表即可满足您的需求
CREATE TABLE `products` ( `product_name` varchar(250) DEFAULT NULL,`date` date DEFAULT NULL,`sales` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*Data for the table `products` */ insert into `products`(`product_name`,`date`,`sales`) values ('Micro','2020-08-01',100),('Micro','2020-08-02',200),('x',300),('y',('z','2020-08-03',400),'2020-08-10',500),'2020-08-11',230),210),240);
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(CASE WHEN date = ''',DATE_FORMAT(DATE,'%Y-%m-%d'),''' THEN round(sales,2) end) AS `','`' ) ) INTO @sql FROM `temp_sale` WHERE DATE BETWEEN DATE_ADD("2020-08-12",INTERVAL -29 DAY) AND "2020-08-12" ;
SELECT GROUP_CONCAT(DISTINCT CONCAT( 'SUM(CASE WEEK(`date`) WHEN "',WEEK(`date`),'" THEN `sales` ELSE 0 END) AS `',CONCAT('week-',WEEK(`date`)),'`' ) ORDER BY WEEK(`date`) ) INTO @sql FROM products as p
SET @sql = CONCAT('select product_name,SUM(`sales`),',@sql,' from products group by product_name'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
product_name | SUM(`sales`) | week-30 | week-31 | week-32 :----------- | -----------: | ------: | ------: | ------: Micro | 300 | 100 | 200 | 0 x | 1930 | 0 | 700 | 1230 y | 2010 | 300 | 0 | 1710 z | 2140 | 0 | 400 | 1740
db 提琴here