【问题标题】:MySQL flip table (pivot)MySQL 翻转表 (pivot)
【发布时间】:2021-09-19 08:40:01
【问题描述】:

** 更新:谢谢大家! SUM 成功了。我的查询运行时间不到 5 秒,而不是我之前的蹩脚解决方案需要 8 分钟才能得出相同的结果!!**

我有一张表格,列出了每种产品每天的销售额:

day product quantity
2021-09-19 Apples 15
2021-09-19 Pears 10
2021-09-19 Potatoes 5
2021-09-18 Apples 25
2021-09-18 Bananas 17
2021-09-17 Potatoes 3

鉴于今天是“2019-09-19”,我想查看最近几天的产品和销售情况,例如:

product c0 c1 c2
Apples 15 25 0
Pears 10 0 0
Potatoes 5 0 3
Bananas 0 17 0

c0 代表今天,c1 代表昨天等等。

我想我必须使用旋转,但我不知道如何... 我尝试了什么:

SELECT product,
COUNT(IF (DATE(day) = UTC_DATE(), quantity, 0)) AS c0,
COUNT(IF (DATE(day) = (UTC_DATE() - INTERVAL 1 DAY), quantity, 0)) AS c1,
COUNT(IF (DATE(day) = (UTC_DATE() - INTERVAL 2 DAY), quantity, 0)) AS c2
FROM sales
GROUP BY product;

但它每天都给出相同的计数...... 即使一天没有销售,我也需要列出的所有产品,按总销售额 DESC 排序。

提前致谢!

【问题讨论】:

  • 使用 SUM() 而不是 COUNT()。
  • 如果答案对您有所帮助,别忘了点赞并选择其中一个作为已接受的答案,其他可能遇到您问题的人可以毫不犹豫地选择一个并向他们学习

标签: mysql sql pivot


【解决方案1】:

你应该使用SUM:

SELECT product,
SUM(IF (DATE(day) = UTC_DATE(), quantity, 0)) AS c0,
SUM(IF (DATE(day) = (UTC_DATE() - INTERVAL 1 DAY), quantity, 0)) AS c1,
SUM(IF (DATE(day) = (UTC_DATE() - INTERVAL 2 DAY), quantity, 0)) AS c2
FROM sales
GROUP BY product;

演示:https://www.db-fiddle.com/f/7yUJcuMJPncBBnrExKbzYz/33

COUNT(expr) [over_clause] 返回非NULL数的计数 SELECT 语句检索的行中的 expr 值。如果 没有匹配的行,COUNT() 返回 0。

https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html#function_count

SUM([DISTINCT] expr) [over_clause]

返回 expr 的总和。如果返回集没有行,则 SUM() 返回 空值。 DISTINCT 关键字可用于仅对不同的值求和 expr.

如果没有匹配的行,SUM() 返回 NULL。

https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html#function_sum

【讨论】:

    【解决方案2】:

    您可以通过使用条件总和聚合以及窗口函数即ROW_NUMBER(),如

    SET @sql = NULL;
    
    SELECT GROUP_CONCAT(
                 CONCAT(
                        'SUM(CASE WHEN day = "', day,'" THEN quantity ELSE 0 END) AS c',rn
                        )
           )
      INTO @sql
      FROM ( SELECT day, ROW_NUMBER() OVER (ORDER BY day DESC)-1 AS rn 
               FROM sales
              GROUP BY day  ) AS d;
    
    SET @sql = CONCAT('SELECT product,',@sql,' FROM sales GROUP BY product'); 
                      
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt; 
    

    Demo

    【讨论】:

    • 非常感谢您的提琴,内容丰富!
    猜你喜欢
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多