如何重新组合和计算列中的元素

时间:2019-06-20 20:10:31

标签: sql group-by syntax-error hue case-when

我掌握了超市组织的任务数据,

  • task_id-每个任务都有一个唯一的ID
  • store_id-每个商店都有一个唯一的编号来标识它
  • week_start-分配任务的星期几
  • 类别-任务的类型(番茄酱,芥末酱,热狗,培根等)
  • 忙-预测该周是否忙的真/假变量
  • 经理-商店经理的姓名

目前,数据是按task_id(单个任务)进行组织的,我希望按store&week对数据进行组织,然后计算每周在类别中分配的任务数量。

此外,类别列目前过于细化,这意味着我想将热狗,培根,火鸡等归类为肉,将番茄酱,芥末,蛋黄酱归类为酱汁。

我实质上是想镜像数据透视表中的结果,其中store_id,week_start,busy和&manager为行,类别为列,然后将类别总和作为中间的数据。但是在这种情况下,使用index(match function。

我尝试运行类似于

的内容

''''SQL

SELECT store_id, week_start, busy, mananger
COUNT(CASE WHEN category = 'hotdog' or 'bacon' or 'turkey') AS MEAT, 
COUNT(CASE WHEN category = 'ketchup' or 'mustard') AS Sauce
FROM table1 
GROUP BY store_id, week_start;

但是我收到的错误是:

AnalysisException:第2行中的语法错误:未定义:“ ketchup” AS Sauce)  ^遇到:如所预期:并且,在之间,DIV,ILIKE,IN,IREGEXP,是,喜欢,不,或者,REGEXP,RLIKE,然后原因:例外:语法错误

1 个答案:

答案 0 :(得分:0)

如果您要计算值,那么我更喜欢sum()胜过count()。无论哪种方式,您都需要一个格式正确的case表达式:

SELECT store_id, week_start, mananger,
       SUM(CASE WHEN category IN ('hotdog','bacon', 'turkey') THEN 1 ELSE 0 END) AS MEAT, 
       SUM(CASE WHEN category IN ('ketchup', 'mustard') THEN 1 ELSE 0 END) AS Sauce
FROM table1 
GROUP BY store_id, week_start;

我还从busy列表中删除了SELECTSELECT中未聚合的列应与GROUP BY中的列兼容。