【问题标题】:SQL group by week with concat使用 concat 按周分组 SQL
【发布时间】:2019-08-02 15:30:16
【问题描述】:

我有一张这样的表(“table_1”)

Day         Product
2019-07-08  a
2019-07-02  b
2019-07-02  b
2019-07-01  a
2019-07-01  b
...

我需要这个:

Week                        a      b
2019-07-01 to 2019-07-08    2      4
2019-07-08 to 2019-07-15    23     5
...

所以,我试图从以下开始近似解决方案:

select 
   concat(Day,'to', Day + interval 6 day) AS week, 
   count(distinct Product) as Counts 
from table_1
group by week(date(Day))

但我收到此错误

"concat"(day, 'to', day + interval 6 day)' must be an aggregate expression or appear in GROUP BY clause

我正在使用 MySQL 和元数据库

【问题讨论】:

  • 考虑处理应用代码中数据显示的问题
  • (你确定你使用的是 MySQL)

标签: mysql sql metabase


【解决方案1】:

一个解决方案——如果你有所有天的数据——是:

select concat(min(Day),'to', min(Day) + interval 6 day) AS week, 
       count(distinct Product) as Counts 
from table_1
group by week(date(Day));

您可能还应该将年份考虑在内。

【讨论】:

  • 我在尝试您的解决方案时收到此错误:不匹配的输入 '6' 期望 {'.', ')', ',', '[', 'AND', 'AT', ' BETWEEN、'IN'、'IS'、'LIKE'、'NOT'、'OR'、'='、NEQ、''、'>='、'+' , '-', '*', '/', '%', '||'}
  • @劳拉。 . . MySQL 支持该语法。
【解决方案2】:

使用日期中的 WEEK 编号的想法与 Gordon 的回答有点相同,以下脚本将给出您确切的预期输出。周计算基于从 SUNDAY 开始的 WEEK。

SELECT  
CONCAT(CAST(DATE_ADD(Day, INTERVAL(1-DAYOFWEEK(Day)) DAY) AS DATE),
    ' To ',
    CAST(DATE_ADD(Day, INTERVAL(1-DAYOFWEEK(Day))+6 DAY) AS DATE)) Week, 
COUNT(CASE WHEN Product = 'a' THEN 1 ELSE NULL END) as a,
COUNT(CASE WHEN Product = 'b' THEN 1 ELSE NULL END) as b
FROM table_1
GROUP BY 
CONCAT(CAST(DATE_ADD(Day, INTERVAL(1-DAYOFWEEK(Day)) DAY) AS DATE),
    ' To ',
    CAST(DATE_ADD(Day, INTERVAL(1-DAYOFWEEK(Day))+6 DAY) AS DATE))
,YEAR(Day);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多