2011-05-02 87 views
6

我絕對與SQL一個小白,我一直在破壞我的頭寫在PostgreSQL符合下表結構的複雜查詢:查詢與子查詢數,內部連接和組

CREATE TABLE reports 
(
    reportid character varying(20) NOT NULL, 
    userid integer NOT NULL, 
    reporttype character varying(40) NOT NULL, 
) 

CREATE TABLE users 
(
    userid serial NOT NULL, 
    username character varying(20) NOT NULL, 
) 

目標的查詢是爲每個用戶提取大量的報告類型並將其顯示在一列中。有三種不同類型的報告。

用一個簡單的查詢組,通過將解決這個問題,但在不同的行顯示出來:

select count(*) as Amount, 
     u.username, 
     r.reporttype 
from reports r, 
    users u 
where r.userid=u.userid 
group by u.username,r.reporttype 
order by u.username 
+1

你期待什麼輸出? – Ruben 2011-05-02 17:47:18

+0

只有三種不同類型的報告:「類型1」,「類型2」,「類型3」,查詢應該在一行中顯示用戶名,「類型1」報告的數量,「類型2」報告的數量以及「 type3「報告。對不起,混淆 – 2011-05-02 18:22:23

+1

在你的例子中的查詢中,你使用c.userid和c.reporttype,但是c來自哪裏?您尚未創建任何名爲c的別名或名爲c的表。 – Ruben 2011-05-02 18:55:19

回答

14
SELECT 
    username, 
    (
    SELECT 
    COUNT(*) 
    FROM reports 
    WHERE users.userid = reports.userid && reports.reporttype = 'Type1' 
) As Type1, 
    (
    SELECT 
    COUNT(*) 
    FROM reports 
    WHERE users.userid = reports.userid && reports.reporttype = 'Type2' 
) As Type2, 
    (
    SELECT 
    COUNT(*) 
    FROM reports 
    WHERE users.userid = reports.userid && reports.reporttype = 'Type3' 
) As Type3 
FROM 
    users 
WHERE 
    EXISTS(
    SELECT 
     NULL 
    FROM 
     reports 
    WHERE 
     users.userid = reports.userid 
) 
+0

這個技巧相當不錯,但有沒有辦法忽略零報告的用戶? – 2011-05-02 19:33:19

+0

查看更新的答案 – Magnus 2011-05-02 19:45:37

+0

您不需要更新您的問題,只需將正確答案標記爲解決方案即可。 – Magnus 2011-05-02 19:58:49

0

如果你正在尋找的「每用戶amountof報告類型」,你會期待對每個用戶看一個數字,1,2或3(假設有三種不同類型的報告)。你不會期待reporttype(它只會被計數而不顯示),所以你不需要查詢中的SELECT或GROUP BY部分的reporttype。

而是使用COUNT(DISTINCT r.reporttype)來計算每個用戶使用的不同報告類型的數量。

SELECT 
COUNT(DISTINCT r.reporttype) as Amount 
,u.username 
FROM users u 
INNER JOIN reports r 
ON r.userid=u.userid 
GROUP BY 
u.username 
ORDER BY u.username 
+0

這不是我正在尋找的。只有三種不同類型的報告:「type1」,「type2」,「type3」,查詢應該顯示一行用戶名,「type1」報告的數量,「type2」報告的數量以及「type3」 「報道。對困惑感到抱歉。 – 2011-05-02 18:20:59

5
SELECT 
    u.username, 
    COUNT(CASE r.reporttype WHEN 1 THEN 1 END) AS type1Qty, 
    COUNT(CASE r.reporttype WHEN 2 THEN 1 END) AS type2Qty, 
    COUNT(CASE r.reporttype WHEN 3 THEN 1 END) AS type3Qty 
FROM reports r 
    INNER JOIN users u ON r.userid = u.userid 
GROUP BY u.username 

如果您的服務器的SQL方言需要else分支存在於CASE表達式,每END前加ELSE NULL

+0

我upvote,因爲我不是子查詢bigfan。謝謝。 – 2017-12-08 11:46:12