簡體   English   中英

SQL 查詢以獲取同一表中列的不同值的計數

[英]SQL query to get count of distinct values of columns in a same table

我有包含性別、狀態等列的表格。

表值是這樣的

ID 性別 地位
1個 男性 A01
2個 男性
3個 女性 A02
4個 女性
5個 未知
6個 男性
7 女性
8個 未知

我要展示

性別 地位 數數
男性 A01 1個
女性 A02 1個
未知 0

我試過了

SELECT 
    t3.Gender, t3.Status, COUNT(*) AS count 
FROM
    (SELECT DISTINCT
         t1.Gender, t1.Status 
     FROM 
         Consumer AS t1
     CROSS JOIN 
         Consumer AS t2 
     WHERE 
         t1.Status <> t2.Status 
         OR t1.Status <> t2.Status) AS t3 
GROUP BY
    t3.Gender, t3.Status

我要顯示的最終 output 是在此處輸入圖像描述 請幫忙解決這個問題。 謝謝

由於現在已經更新了所需的結果,因此解決方案現在有很大不同。

嘗試:

SELECT
  CASE WHEN GROUPING(Status) = 1 THEN 'Total' ELSE Status END AS Status,
  --ISNULL(Status, 'Total') AS Status, -- This would not work is actual Status might be null
  COUNT(CASE WHEN Gender = 'Female' THEN 1 END) AS Female,
  COUNT(CASE WHEN Gender = 'Male' THEN 1 END) AS Male,
  COUNT(CASE WHEN Gender = 'Unknown' THEN 1 END) AS Unknown,
  COUNT(*) AS Count
FROM @Consumer
WHERE Status > ''
GROUP BY Status WITH Rollup
ORDER BY GROUPING(Status), Status

上面使用條件聚合來獲取部分計數。 WITH ROLLUP自動創建總計行。 ISNULL()為該行設置狀態 label(否則將顯示為空)。 最后, ORDER BY中的GROUPING()將匯總/總計放在詳細信息行之后。

請參閱這個 db<>fiddle這個帶有擴展測試數據的小提琴。

還有一些方法可以使用 pivot 表來執行此操作,但以上可能足以滿足您當前的需求。

select  *
       ,Male + Female + Unknown as count
from    t
pivot(count(id) for gender in(Male, Female, Unknown))p
where status is not null

union all


select  'Total'
       ,count(case when gender = 'Male' then status end)    as Male
       ,count(case when gender = 'Female' then status end)  as Female
       ,count(case when gender = 'Unknown' then status end) as Unknown
       ,count(status) as Total
from   t
地位 男性 女性 未知 數數
A01 1個 0 0 1個
A02 0 1個 0 1個
全部的 1個 1個 0 2個

小提琴

你可能想多了你的要求。 也許以下會起作用:

SELECT Gender, Status, COUNT(*) AS count
FROM Consumer
GROUP BY Gender, Status
ORDER BY Gender, Status

目前尚不清楚您對未知性別的結果有何期望。 如果您需要對未知性別和/或空白狀態進行特殊處理,您可以在上面的正常情況下添加WHERE條件,並使用第二個查詢UNION ALL結果來處理特殊情況。

SELECT Gender, Status, COUNT(*) AS count
FROM Consumer
WHERE Gender <> 'Unknown' AND Status > ''
GROUP BY Gender, Status
  UNION ALL
SELECT 'Unknown' AS Gender, '' AS Status, COUNT(*) AS count
FROM Consumer
WHERE NOT (Gender <> 'Unknown' AND Status > '')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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