[英]Grouping but with keeping all non-NULL values
假設我有桌子:
ID | Name | Intolerance
1 | Amy | Lactose
2 | Brian | Lactose
3 | Amy | Gluten
然后運行此SQL查詢:
SELECT
Name,
CASE
WHEN Intolerance = 'Lactose' 1
END AS Lactose,
CASE
WHEN Intolerance = 'Gluten' 1
END AS Gluten
FROM
Table
我得到:
Name | Lactose | Gluten
-------+---------+--------
Amy | 1 |
Amy | | 1
Brian | 1 |
但是,如果我嘗試添加“ GROUP BY Name”,則Amy的兩列都不會有1,因為GROUP BY僅選擇每個Name的最后一行。 我想得到的是:
Name | Lactose | Gluten
------+---------+---------
Amy | 1 | 1
Brian | 1 |
我該怎么辦? 也許有一種更有效的方法來總結誰對相同輸入的內容過敏? 提前致謝。
使用GROUP BY時 ,聚合函數可用於不在GROUP BY中的列。
在這種情況下,我假設您要使用MAX ,僅獲得1或NULL。
SUM或COUNT也可以用於包圍CASE WHEN
。
但是,那將返回總計。
SELECT
Name,
MAX(CASE WHEN Intolerance = 'Lactose' THEN 1 END) AS Lactose,
MAX(CASE WHEN Intolerance = 'Gluten' THEN 1 END) AS Gluten
FROM Table
GROUP BY Name
ORDER BY Name
還是如果您不想看到NULL?
然后,讓CASE返回一個varchar而不是一個數字。
SELECT
Name,
MAX(CASE WHEN Intolerance = 'Lactose' THEN '1' ELSE '' END) AS Lactose,
MAX(CASE WHEN Intolerance = 'Gluten' THEN '1' ELSE '' END) AS Gluten
FROM Table
GROUP BY Name
ORDER BY Name
我認為您需要的是每個人的不寬容總數。 另外,輸入ELSE
,使其值為0
或1
:
SELECT
Name,
SUM(CASE WHEN Intolerance = 'Lactose' THEN 1 ELSE 0 END) AS Lactose,
SUM(CASE WHEN Intolerance = 'Gluten' THEN 1 ELSE 0 END) AS Gluten
FROM Table
GROUP BY Name
ORDER BY Name
我覺得每次遇到這樣的問題,都是因為對該項目沒有適當的設計思想。
簡而言之:您正在嘗試將數據移至列。 這就是您的應用程序層的用途! 不是數據庫。 人們傾向於將數據庫用於什么應用程序/ UI層,反之亦然!
每次發生這種情況時,我都會看到人們下定決心要回答,因為這就是重點:無論如何都回答問題。 不要質疑OP想要做什么,給他答案...
抱歉,我有點生氣。
我的解決方案 :保留原始查詢,並在UI /應用程序層實現美觀。 您可能在每個Person內部都有一個IList。 只需填寫它們,並為UI提供根據需要顯示它們的機會。 因為這就是您要數據庫執行的操作:美觀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.