簡體   English   中英

分組但保留所有非NULL值

[英]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 ,使其值為01

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM