【问题标题】:SQL aggregation with case statement and group by带有 case 语句和 group by 的 SQL 聚合
【发布时间】:2016-06-19 08:46:41
【问题描述】:

我试图理解这段代码的问题:

SELECT COUNT(CASE liveIn.state
                 WHEN ("NY" OR "NJ") THEN "group1" 
                 WHEN ("NC" or "SC") THEN "group2"
             END) AS state_groups
FROM (SELECT DISTINCT user_guid, state
        FROM users
          WHERE country="US" AND country IS NOT NULL) AS liveIn
GROUP BY state_groups; 

我得到的错误是:“不能在 'state_groups' 上分组”

我有其他代码可以解决我的问题,看起来像这样(但我试图理解上面的问题):

SELECT COUNT(DISTINCT user_guid),
       CASE
           WHEN (state="NY" OR state="NJ") THEN "group1" 
           WHEN (state="NC" OR state="SC") THEN "group2"
       END AS state_groups
FROM users
     WHERE country="US" AND country IS NOT NULL
GROUP BY state_groups; 

我的输出应该是这样的:

TKS!

P.S.-这是 coursera sql 学习课程的一部分,所以我正在研究 Jupyter。

【问题讨论】:

  • 然后添加查询应该做什么,示例数据和预期输出
  • 有什么问题?你有错误吗?结果错误?
  • 您的问题到底是什么?你得到什么错误?您使用的是哪个 DBMS?您的表中有名为NYUS 的列吗?因为"NY""US" 是SQL 中的列标识符。
  • 我假设您想了解您在上面发布的 sql - 是这样吗?
  • 一门课程教你"US" 是 SQL 中的有效字符串常量,不应该被信任。

标签: sql group-by case


【解决方案1】:

您的case when 返回组值,但它们在包裹在count 中时没有用,因为它们都将作为 1 贡献给它。此外,您不能按要基于组计算的聚合进行分组。请注意,您的第一个 SQL 中只有一列。您应该有 2 个:一个标识组,另一个标识计数。您将两者合二为一,这没有任何意义。

这将是一个有效的替代方案:

SELECT   CASE state
             WHEN "NY" THEN "group1" 
             WHEN "NJ" THEN "group1" 
             WHEN "NC" THEN "group2"
             WHEN "SC" THEN "group2"
             ELSE           "others"
         END AS state_group,
         COUNT(DISTINCT user_guid) AS user_count
FROM     USERS
WHERE    country = "US" 
GROUP BY state_group

SQL fiddle

请注意,如果您在 when 子句的这个变体中放置一个 or,则该 or 的第二项将被单独评估,并使条件为真,因此所有值将在 group1。

您可以使用case when 语法的其他变体,您可以使用or 甚至更好,in

SELECT   CASE WHEN state IN ("NY", "NJ") THEN "group1" 
              WHEN state IN ("NC", "SC") THEN "group2"
              ELSE                            "others"
         END AS state_group,
         COUNT(DISTINCT user_guid) AS user_count
FROM     USERS
WHERE    country = "US" 
GROUP BY state_group

请注意,在此语法中,case 和第一个 when 之间没有任何内容。

【讨论】:

  • 首先,感谢您的回答。但我不太确定为什么你说“case when”在包含计数时没有用。当我运行这个查询时: select 'COUNT(CASE WHEN country="US" THEN "group1" END) AS groups FROM users;这个查询: SELECT COUNT(user_guid) FROM users WHERE country="US";我得到了相同的结果
  • 您计算的任何值(“group1”、“group2”、...)都算作一个。它不会以这种方式区分“group1”和“group2”(在问题中的第一个 SQL 中)。但更重要的是,您的第一个查询语法正在循环:您将组定义为计数,但您希望每个组发生计数。这是一个无法解决的悖论,也是您收到错误消息的原因。
  • 这回答了您的问题吗?你能发表评论吗?
  • 对不起...您确实回答了我的问题!谢!!
猜你喜欢
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
  • 2019-10-23
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
相关资源
最近更新 更多