【问题标题】:Multiple count statements/conditions多个计数语句/条件
【发布时间】:2016-08-24 15:24:22
【问题描述】:

我有以下列:

Product_ID,sale_price,sale_count,sale_state
9923842,49.99,329,CA
2940820,55.25,430,WA
2039483,32.45,23,OR
9348234,55.02,26,NY
1948134,99.42,200,VA
3948579,43.49,994,MA
2034209,934.3,430,FL

我正在尝试根据西海岸与东海岸(CA 和 OR 位于西海岸,NY 和 MA 位于东部,依此类推)按海岸查找 sale_count 大于 100 的州的计数。 所以结果看起来像:

coast,count,total_count
East,3,4
West,2,3

... 其中 total_count 是该海岸的州总数,与销售数量无关

我能想到的唯一方法是创建一个带有州/海岸映射的表,然后将其用作参考。 有没有更好的方法而不必求助于临时表?

这目前正在 MySQL 中完成,但我想要一个与平台无关的解决方案,因为这可能很快就会移植到另一个平台。

【问题讨论】:

  • total_count 是什么?产品数量与sale_count > 100无关?
  • 对,什么是计数与总计数?
  • 是的,total_count 与 sale_count 无关>100 - 编辑了问题
  • 谢谢,在下面更新了我的查询

标签: sql count


【解决方案1】:

这是一个标准的 ANSI 方法,我希望它应该可以工作

    SELECT 'East' AS Coast, 
           SUM(CASE WHEN sale_count > 100 THEN 1 ELSE 0 END) AS cnt, 
           COUNT(*) AS total_count 
    FROM table 
    WHERE sale_state IN ('NY','MA')

    UNION ALL

    SELECT 'West' AS Coast, 
           SUM(CASE WHEN sale_count > 100 THEN 1 ELSE 0 END) AS cnt, 
           COUNT(*) AS total_count 
    FROM table 
    WHERE sale_state IN ('CA','OR')

我来自欧盟,所以我让你填写各州的名单...

【讨论】:

    【解决方案2】:

    编辑:这个包含上面评论中描述的 count 和 total_count

    SELECT coast, SUM(sale_cnt) AS count, COUNT(*) AS total_count
    FROM T LEFT JOIN
    (SELECT sale_state,
    CASE 
    WHEN sale_state IN ('CA','WA','OR') THEN 'West'
    WHEN sale_state IN ('NY','VA','MA','FL') THEN 'East' END AS coast,
    CASE
    WHEN sale_count > 100 THEN 1
    ELSE 0 END AS sale_cnt
    FROM T) C
    ON T.sale_state = C.sale_state
    GROUP BY coast
    

    【讨论】:

    • 这种方法的问题是它不适用于许多 RDBMS,因为在 GROUP BY 子句中使用别名列不符合 ANSI ;)
    猜你喜欢
    • 2017-09-06
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多