【问题标题】:How do I return count and not count in a SQL query?如何在 SQL 查询中返回计数而不是计数?
【发布时间】:2010-04-13 14:41:52
【问题描述】:

如果我有一张桌子

AgentID | IsNew | TeamID
1         N       1
2         Y       2
3         Y       2
4         N       2
5         Y       1

我想从查询中返回以下内容:

Team | CountIsNew = N | CountIsNew = Y
1      1                1
2      1                2

有什么办法可以做到这一点吗?
使用 Oracle 10

【问题讨论】:

    标签: sql oracle select


    【解决方案1】:
    SELECT  team, SUM(DECODE(IsNew, 'N', 1, 0)), SUM(DECODE(IsNew, 'Y', 1, 0))
    FROM    mytable
    GROUP BY
            team
    

    【讨论】:

    • 5/5 - 干杯人。我去看看解码,看看它是如何工作的!
    • @OMGPonies:我更喜欢DECODE 用于此类分组查询,因为它是NULL-aware。 DECODE(NULL, NULL, 1, 0) 返回 1CASE NULL WHEN NULL THEN 1 ELSE 0 END 返回 0。您可以将 NULL 替换为任何其他常规值。
    • 我是否正确地说 DECODE 是特定于 oracle 而 Dirk 的答案适用于任何数据库?
    【解决方案2】:
    SELECT TeamId
         , SUM(CASE WHEN IsNew = 'N' THEN 1 ELSE 0 END) AS CountIsNotNew
         , SUM(CASE WHEN IsNew = 'Y' THEN 1 ELSE 0 END) AS CountIsNew
    FROM Agent
    GROUP BY TeamId
    

    【讨论】:

      【解决方案3】:

      另一种方式 - COUNT 不计算 NULL(COUNT(*) 除外):

      SELECT TeamId,
             COUNT(DECODE(IsNew,'N',1)) CountIsNotNew,
             COUNT(DECODE(IsNew,'Y',1)) CountIsNew
      FROM Agent
      GROUP BY TeamId;
      

      或者,如果您更喜欢 CASE:

      SELECT TeamId,
             COUNT(CASE IsNew WHEN 'N' THEN 1 END) CountIsNotNew,
             COUNT(CASE IsNew WHEN 'Y' THEN 1 END) CountIsNew
      FROM Agent
      GROUP BY TeamId;
      

      (注意:“1”可以是任何文字值)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 2013-06-11
        • 2018-07-07
        • 1970-01-01
        • 2011-12-23
        相关资源
        最近更新 更多