[英]SQL: How can I make sure all SELECT Cases are represented even if not all are executed?
這是我的代碼
SELECT
CASE
WHEN Money >= 20000 THEN '$ 20,000 + '
WHEN Money BETWEEN 10000 AND 19999 THEN '$ 10,000 - $ 19,999'
WHEN Money BETWEEN 5000 AND 9999 THEN '$ 5,000 - $ 9,999'
WHEN Money BETWEEN 1 AND 4999 THEN '$ 1 - $ 4,999'
ELSE '$ 0'
END AS [MONEY],
COUNT(*) AS [#],
MAX(Money) AS [MAX]
FROM MyTable
WHERE MoneyType = 'Type A'
GROUP BY
CASE
WHEN Money >= 20000 THEN '$ 20,000 + '
WHEN Money BETWEEN 10000 AND 19999 THEN '$ 10,000 - $ 19,999'
WHEN Money BETWEEN 5000 AND 9999 THEN '$ 5,000 - $ 9,999'
WHEN Money BETWEEN 1 AND 4999 THEN '$ 1 - $ 4,999'
ELSE '$ 0'
END
ORDER BY MAX DESC
現在我的問題是我希望所有的情況都在我的結果集中顯示一行但是,因為我沒有任何值會落在1到4999之間,那行不會出現。 我仍然希望顯示該行,並且只為其列包含0(當然除了第一行)。 任何人都可以告訴我如何修改代碼來實現這一目標? 也許我需要以不同的方式做...謝謝!
結果集示例我正在尋找......
| [MONEY] | [#] | [MAX] |
| $ 20,000+ | 2 | 30,000 |
| $ 10,000 - $ 19,999 | 8 | 19,000 |
| $ 5,000 - $ 9,999 | 4 | 8,000 |
| $ 1 - $ 4,999 | 0 | 0 | <-- Row currently doesn't show
| $ 0 | 12 | 0 |
您可以使用CTE構建查找表,然后使用它來對其進行分組而不是Case語句。 您需要進行其他三項更改
WITH Ranges AS
( SELECT 1 id , '$ 20,000 +' description
UNION SELECT 2 , '$ 10,000 - $19,999'
UNION SELECT 3, '$ 5,000 - $ 9,999'
UNION SELECT 4, '$ 1 - $ 4,999'
UNION SELECT 5, '$ 0')
SELECT
r.Description as money,
COUNT(t.Money) AS [#],
MAX(Money) AS [MAX]
FROM
Ranges r
LEFT JOIN
MyTable t
ON r.ID = CASE
WHEN Money >= 20000 THEN 1
WHEN Money BETWEEN 10000 AND 19999 THEN 2
WHEN Money BETWEEN 5000 AND 9999 THEN 3
WHEN Money BETWEEN 1 AND 4999 THEN 4
ELSE 5
END
AND MoneyType = 'Type A'
GROUP BY
r.id,
r.Description
ORDER BY r.id asc
您可以將描述性文本存儲在真實或短暫的表格中並相應地加入,例如:
;with ranges(min,max,caption) as (
select 10000, 19999, '$ 10,000 - $19,999' union
select 5000, 9999, '$ 5,000 - $ 9,999' union
select 1, 4999, '$ 1 - $ 4,999'
)
select
isnull(r.caption, 'no description'),
count(m.money) as [#],
isnull(max(m.money), 0)
from
mytable m
full outer join
ranges r on m.money between r.min and r.max
group by
r.caption
您可以添加值,然后插入另一個組(無法訪問SSMS進行測試):
SELECT [MONEY], SUM([#]) AS [#], MAX([MAX]) AS [MAX] FROM
(SELECT
CASE
WHEN Money >= 20000 THEN '$ 20,000 + '
WHEN Money BETWEEN 10000 AND 19999 THEN '$ 10,000 - $19,999'
WHEN Money BETWEEN 5000 AND 9999 THEN '$ 5,000 - $ 9,999'
WHEN Money BETWEEN 1 AND 4999 THEN '$ 1 - $ 4,999'
ELSE '$ 0'
END AS [MONEY],
COUNT(*) AS [#],
MAX(Money) AS [MAX]
FROM MyTable
WHERE MoneyType = 'Type A'
GROUP BY
CASE
WHEN Money >= 20000 THEN '$ 20,000 + '
WHEN Money BETWEEN 10000 AND 19999 THEN '$ 10,000 - $19,999'
WHEN Money BETWEEN 5000 AND 9999 THEN '$ 5,000 - $ 9,999'
WHEN Money BETWEEN 1 AND 4999 THEN '$ 1 - $ 4,999'
ELSE '$ 0'
END
UNION ALL
SELECT '$ 0' AS [MONEY], 0 AS [#], 0 AS [MAX]
UNION ALL
SELECT '$ 1 - $ 4,999' AS [MONEY], 0 AS [#], 0 AS [MAX]
UNION ALL
SELECT '$ 5,000 - $ 9,999' AS [MONEY], 0 AS [#], 0 AS [MAX]
UNION ALL
SELECT '$ 10,000 - $19,999' AS [MONEY], 0 AS [#], 0 AS [MAX]
UNION ALL
SELECT '$ 20,000 + ' AS [MONEY], 0 AS [#], 0 AS [MAX]
) SUB
GROUP BY [MONEY]
嗯......我要做的:
而不是從表t
我從子查詢中選擇
From
(
Select Money, 1 as ForReal from Table t
Union
Select 1, 0
Union
Select 5000, 0
Union
Select 10000, 0
Union
Select 20001, 0
)
我的最佳選擇是Max(Money * ForReal),所以你得到你的分組,0作為MaxAmount ..
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.