[英]How to write the sql query to select and group by type and count per type?
[英]How to write an SQL query that returns count = 0 when no records found in group
我有一個客戶表,我需要按照以下順序從中選擇數據:
Gender Count
-----------------
Female 10
Male 50
Unknown 2
(上表數據僅作為示例)
為此,我使用了以下SQL:
SELECT decode(gender, 'F', 'Female', 'M', 'Male', 'Unknown') "Gender"
, count(ID) "Count"
FROM client c
WHERE c.created <= '01-JAN-2000'
GROUP BY decode(gender, 'F', 'Female', 'M', 'Male', 'Unknown')
ORDER BY decode(gender, 'F', 'Female', 'M', 'Male', 'Unknown')
;
但是,問題是沒有在2000年1月1日之前創建的客戶端! 因此,該表顯示為空白:
Gender Count
----------------
但是,我想在這種情況下顯示如下:
Gender Count
----------------
Female 0
Male 0
Unknown 0
請告訴我該怎么做?
您可以先選擇性別(使用內聯視圖),然后對結果進行left outer join
。 這將確保始終在第一列中顯示性別列表:
SELECT g.gender
, count(ID) "Count"
FROM ( select 'Female' gender from dual
union all
select 'Male' gender from dual
union all
select 'Unknown' gender from dual
) g
left
outer
join client c
on decode(c.gender, 'F', 'Female', 'M', 'Male', 'Unknown') = g.gender
and c.created <= '01-JAN-2000'
GROUP
BY g.gender
ORDER
BY g.gender
;
您應該規范化數據以保存性別表。 或者至少在查詢中使用一個(視圖),如下所示,然后進行OUTER連接。
並使用標准日期格式。
編輯:為了更好的可讀性和性能,您必須仔細分類性別。 在此假定未知情況的附加類別“ U”。
SELECT g.GENDER "Gender"
, count(ID) "Count"
FROM client c,
( SELECT 'Female' As Gender,'F' as GenderId FROM DUAL
UNION ALL
SELECT 'Male','M' FROM DUAL
UNION ALL
SELECT 'Unknown','U' FROM DUAL
) g
WHERE c.created(+) <= DATE '2000-01-01'
AND c.Gender(+) = g.genderId
GROUP BY g.gender
ORDER BY g.gender
;
這是怎么做的
SELECT
'Female' Gender
, Count(c.ID) Count
FROM
Client c
WHERE
c.Gender = 'F'
UNION ALL
SELECT
'Male' Gender
, Count(c.ID) Count
FROM
Client c
WHERE
c.Gender = 'M'
UNION ALL
SELECT
'Unknown' Gender
, Count(c.ID) Count
FROM
Client c
WHERE
c.Gender is NULL
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.