【问题标题】:SQL; Only count the values specified in each columnSQL;只计算每列中指定的值
【发布时间】:2010-10-29 06:03:54
【问题描述】:

在 SQL 中,我有一个名为“answer”的列,其值可以是 1 或 2。我需要生成一个 SQL 查询来计算每个月 1 和 2 的数量。我有以下查询,但它不起作用:

SELECT MONTH(`date`), YEAR(`date`),COUNT(`answer`=1) as yes,
COUNT(`answer`=2) as nope,` COUNT(*) as total

FROM results

GROUP BY YEAR(`date`), MONTH(`date`)

【问题讨论】:

    标签: sql count


    【解决方案1】:

    我会按年、月以及答案本身进行分组。这将导致每月两行:一个计算答案 1 的出现次数,另一个计算答案 2(对于其他答案值也是通用的)

    SELECT MONTH(`date`), YEAR(`date`), answer, COUNT(*)
    FROM results
    GROUP BY YEAR(`date`), MONTH(`date`), answer
    

    【讨论】:

    • 和我的想法一样。我敢肯定它也更快。
    • 好主意,虽然这不会返回总数
    • @Andomar:来自问题 - “我需要生成一个 SQL 查询来计算每个月的一和二的数量”。他没有提到任何关于计算总数的事情(尽管它确实出现在他的查询中,但我怀疑这只是因为它“容易”)。计算总数不是什么大挑战,只需从 GROUP BY 和 SELECT 中删除“答案”即可。
    【解决方案2】:

    尝试 SUM-CASE 技巧:

    SELECT 
        MONTH(`date`), 
        YEAR(`date`),
        SUM(case when `answer` = 1 then 1 else 0 end) as yes,
        SUM(case when `answer` = 2 then 1 else 0 end) as nope,
        COUNT(*) as total
    FROM results
    GROUP BY YEAR(`date`), MONTH(`date`)
    

    【讨论】:

    • 一种变体是使用计数(answer=1 然后answerelse null 结束时的不同情况)。当您的连接会使相同的行出现多次并且您在答案中有不同的值时(使用 sum(1) 将为同一主行添加多次),它会更有用。在这种情况下没用,但值得一提:)
    【解决方案3】:
    SELECT year,
           month,
           answer
           COUNT(answer) AS quantity
    FROM results
    GROUP BY year, month, quantity
    
    年|月|答案|数量 2001| 1| 1| 2 2001| 1| 2| 1 2004| 1| 1| 2 2004| 1| 2| 2
    SELECT * FROM results;
    
    年|月|答案 2001| 1| 1 2001| 1| 1 2001| 1| 2 2004| 1| 1 2004| 1| 1 2004| 1| 2 2004| 1| 2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多