[英]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
由於現在已經更新了所需的結果,因此解決方案現在有很大不同。
嘗試:
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.