【问题标题】:Merge two SELECT queries into one将两个 SELECT 查询合并为一个
【发布时间】:2011-02-23 14:28:04
【问题描述】:

我有两个查询,我只需要总记录数,但查询的唯一区别是一个字段值。

示例;

SELECT COUNT(*) AS group_a
FROM tbl
WHERE category = 'value_a'

SELECT COUNT(*) AS group_b
FROM tbl
WHERE category = 'value_b'

我怎样才能得到这样的东西:(伪)

SELECT COUNT(*) AS group_a, COUNT(*) AS group_b
FROM tbl
WHERE category IN ('value_a', 'value_b')

但是结果是这样的

group_a , group_b
56, 101

我正在考虑在查询中使用 CASE 语句来过滤这两者,但我该如何实现呢?还是有更好的方法?

我现在正在做一个 UNION,但想知道我是否可以返回一个包含两个结果的记录

【问题讨论】:

    标签: sql postgresql logic


    【解决方案1】:
    select sum(case when category = 'value_a' then 1 else 0 end) as group_a,
           sum(case when category = 'value_b' then 1 else 0 end) as group_b
        from tbl
        where category in ('value_a', 'value_b')
    

    【讨论】:

    • 请注意,where 子句仅在“类别”列被索引时才有帮助
    • +1 以补偿反对票。不加解释地投反对票不是很有礼貌。也许你是对的,向我们展示论据。
    • @Frank:谢谢,我同意。当我错了我不介意投反对票(我可以像任何人一样犯错误),但我不喜欢匿名投反对票。
    【解决方案2】:
    select  sum(case when category = 'value_a' then 1 else 0 end) group_a,
            sum(case when category = 'value_b' then 1 else 0 end) group_b
    from tbl
    

    【讨论】:

      【解决方案3】:
      SELECT category,COUNT(*) FROM tbl
      GROUP BY category;
      

      这扩展到更多类别。如果您只想要这些类别

      SELECT category,COUNT(*) FROM tbl
      WHERE category IN ('value_a', 'value_b')
      GROUP BY category; 
      

      【讨论】:

      • 您应该在其中添加一个 WHERE 类别 IN ('value_a', 'value_b')。
      • 该死的互联网,你的速度很快。
      • 这个答案不正确。任务是将这些组放在一行中。
      • 我确实喜欢简单的 GROUP BY 所以 +1,但需要在单行返回
      • 返回整个结果集,而不是逐行,确定吗?它做同样的事情!
      【解决方案4】:

      计数的答案多么奇怪。这是一个简单的 COUNT:

      SELECT COUNT(category = 'value_a' OR NULL) AS group_a, COUNT(category = 'value_b' OR NULL) AS group_b FROM tbl;
      

      PostgreSQL 中的 COUNT 聚合允许像我展示的那样复杂的语法。请注意,OR NULL 非常重要,因为 COUNT 仅计算条件 category = '...' OR NULL 给出非 NULL 答案的那些行。

      【讨论】:

        【解决方案5】:

        只是为了好玩:

        SELECT * 
        FROM 
        (
            SELECT category
            FROM tbl 
        ) subquery
        PIVOT
        (
            COUNT(category)
            FOR category IN ([value_a],[value_b])
        ) AS piv
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-24
        相关资源
        最近更新 更多