【问题标题】:Count with Case Select in Oracle在 Oracle 中使用案例选择进行计数
【发布时间】:2015-06-10 11:02:59
【问题描述】:

我有以下疑问:

SELECT t.range,
       Count(*)
FROM (
    SELECT CASE 
            WHEN creditscore BETWEEN 300
                    AND 499
                THEN '[300, 499]'
            WHEN creditscore BETWEEN 500
                    AND 699
                THEN '[500, 699]'
            WHEN creditscore BETWEEN 700
                    AND 850
                THEN '[700, 850]'
            END AS range
    FROM customer
    ) T
GROUP BY t.range;

这给了我以下信息:

CS range     COUNT(*)
---------- ----------
[700, 850]          7
[500, 699]         13

我想要以下输出:

CS range     COUNT(*)
---------- ----------
[300, 499]          0
[500, 699]         13
[700, 850]          7

谁能帮帮我?

更新

我执行了贾斯汀提供的代码。它给了我以下信息:

DESCRIPTIO   COUNT(*)
---------- ----------
[300, 499]          1
[700, 850]          7
[500, 699]         13

SQL> SELECT COUNT(*) FROM customer where creditscore BETWEEN 300 AND 499;

COUNT(*)
----------
         0

【问题讨论】:

  • 用范围创建一个临时表,然后LEFT JOIN 将它添加到您的结果中,将 null 替换为 0。

标签: oracle select case


【解决方案1】:

在这种情况下,您可以使用unpivot。 你的答案-

Select * From
(
Select Sum(Col1) "[300, 499]", Sum(Col2) "[500, 699]", Sum(Col3) "[700, 850]"
From (
    Select Case 
            When Creditscore Between 300
                    And 499
                Then 1 Else 0 End As Col1,
            Case When Creditscore Between 500
                    And 699
                Then 1  Else 0 End Col2,
            Case When Creditscore Between 700
                    And 850
                Then 1  Else 0 End Col3
    From Customer
    )
)
Unpivot
(
  "Count"
  For
  "Description" In ("[300, 499]", "[500, 699]", "[700, 850]")
);

结果 -

Description  Count
[300, 499]    0
[500, 699]    4
[700, 850]    3

【讨论】:

    【解决方案2】:

    一种选择是做类似的事情

    WITH ranges AS (
      SELECT '[300, 499]' description, 300 min_val, 499 max_val FROM dual
      UNION ALL
      SELECT '[500, 699]' description, 500 min_val, 699 max_val FROM dual
      UNION ALL
      SELECT '[700, 850]' description, 700 min_val, 850 max_val FROM dual
    )
    SELECT r.description, count(creditscore)
      FROM ranges r
           LEFT OUTER JOIN customer c 
             ON (c.creditscore BETWEEN r.min_val AND r.max_val)
     GROUP BY r.description
    

    通常,您希望为您的范围设置一个永久表格,以防将来有人想要添加或修改它们。但是您可以像我在此处那样对查询中的范围进行硬编码。

    【讨论】:

    • 您的查询似乎为 300 到 499 之间的记录提供了额外的输出。我已经更新了问题,请看。
    • @AngryPanda - 抱歉,我有一个 count(*) 而不是 count(creditscore)
    猜你喜欢
    • 2014-02-09
    • 1970-01-01
    • 2015-11-11
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    相关资源
    最近更新 更多