我可以轻松地根据日期旋转结果,但无法根据周数执行相同的操作。
表结构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','2020-08-02',300),
('y','2020-08-01',300),
('z','2020-08-03',400),
('x','2020-08-03',400),
('y','2020-08-10',500),
('z','2020-08-10',500),
('x','2020-08-10',500),
('y','2020-08-10',500),
('z','2020-08-10',500),
('x','2020-08-10',500),
('y','2020-08-10',500),
('z','2020-08-10',500),
('x','2020-08-11',230),
('y','2020-08-11',210),
('z','2020-08-11',240);
按日期显示销售总额的查询,如下我使用的 mysql 代码
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 `',
DATE_FORMAT(DATE, '%Y-%m-%d'), '`'
)
) 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','2020-08-02',300), ('y','2020-08-01',300), ('z','2020-08-03',400), ('x','2020-08-03',400), ('y','2020-08-10',500), ('z','2020-08-10',500), ('x','2020-08-10',500), ('y','2020-08-10',500), ('z','2020-08-10',500), ('x','2020-08-10',500), ('y','2020-08-10',500), ('z','2020-08-10',500), ('x','2020-08-11',230), ('y','2020-08-11',210), ('z','2020-08-11',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 `', DATE_FORMAT(DATE, '%Y-%m-%d'), '`' ) ) 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<> fiddle here
关于mysql - 如何根据mysql中的周数透视记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63380016/