一行中有多个where子句的SQL

5
我想将以下语句融合成一条查询。
SELECT COUNT(*) AS count1 WHERE Month='11' AND Flag = 1
SELECT COUNT(*) AS count2 WHERE Month='11' AND Flag = 2
SELECT COUNT(*) AS count1 WHERE Month='12' AND Flag = 1
    SELECT COUNT(*) AS count2 WHERE Month='12' AND Flag = 2

我希望这可以显示为一个查询,包括列count1和count2以及行月份11和12。
是否有相应的语法?

为什么月份是一个字符串? - Damien_The_Unbeliever
1
@Damien_The_Unbeliever 数据是一个包含大量垃圾数据的Excel表格导入。我最初将所有内容都作为字符串导入,以便开始清理数据并使其更易管理。 - steventnorris
3个回答

9
你可以结合SUMCASE一次性获取各种计数:
SELECT
    Month,
    SUM(CASE WHEN Flag=1 THEN 1 ELSE 0 END) as count1,
    SUM(CASE WHEN Flag=2 THEN 1 ELSE 0 END) as count2
from
    ...
WHERE Month in ('11','12')
GROUP BY
    Month /* Other columns? */

OP只想要两列。 - aF.
@af,如果使用两列来显示,就无法清晰地知道每个计数对应的月份。 - HLGEM
我使用了这个变体,并成功地得到了两列,其中一列是月份。这正是我所需要的。 - steventnorris

1

只有两列,可能长这样:

select
   (SELECT COUNT(*) FROM tablename WHERE Month='11' AND Flag = 1) as 'count1'
   (SELECT COUNT(*) FROM tablename WHERE Month='11' AND Flag = 2) as 'count2'

UNION ALL

select
   (SELECT COUNT(*) FROM tablename WHERE Month='12' AND Flag = 1), 
   (SELECT COUNT(*) FROM tablename WHERE Month='12' AND Flag = 2)

请用您的表格名称替换 tablename


也许你在每行末尾缺少一个逗号,正确的写法应该是: (SELECT COUNT() FROM tablename WHERE Month='11' AND Flag = 1) as 'count1', (SELECT COUNT() FROM tablename WHERE Month='11' AND Flag = 2) as 'count2'。 - Saeed Ansari

-1
这样怎么样:
select
    month, flag, count(*)
from
    table
where
    month in ('11', '12') and
    flag in (1, 2)
group by
    month, flag;

但是 OP 希望每个计数都有一列,只有两行。 - Lamak
注意了,我只是想他之后会用一些代码处理输出结果。我的意思是,谁会在他们的输出中使用未经修改的原始 SQL 呢?也许这是我太过自以为是了... :) - Alex Howansky
@alexhowansky 我实际上将使用原始未经处理的SQL。这更像是一个快速报告而不是一个应用程序。我只需要提取数据,如果我能快速并以格式完成,就可以避免我手动调整成我想要的格式。 - steventnorris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接