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

标签 mysql pivot

我可以轻松地根据日期旋转结果,但无法根据周数执行相同的操作。

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

上述查询的输出如下所示

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','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/

相关文章:

MySQL 删除所有带有废弃 ID 的行

mysql - Rails 临时表

php - 如何使用 eloquent 根据数据库关系订购 JSON 响应

mysql - 为选择查询中加入主表和链接表的列赋值

sql - 将任意多行转换为 PostgreSQL 中的列

sql - 如何在 SQL PIVOT 中 ORDER BY

php - Laravel 急切加载以最大程度地减少查询

php - 使用动态变量查询MySQL表

mysql - MySQL 中的动态查询

mysql - MySQL 中具有可变数量动态列的数据透视表(组键 = id 字段的值行)