如何在mysql中根据周数透视记录?

问题描述

我可以轻松地将结果日期进行透视,但是无法在周数中进行透视。

表结构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);

用于按日期显示销售额的查询,如下所示我使用的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 `','`'
    )
  ) 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;

输出上述查询,如下所示

enter image description here

但是问题是我需要按周汇总销售记录的总和。就像

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