2015-04-28 54 views
2

我有一個看起來像這樣的大型SQL數據庫:database layout計數頻率,顯示結果爲所有列用空格填充

對於單個列,我會算頻率命令:

SELECT col1,count(1) FROM tbl GROUP BY col1; 

給的東西,看起來像這樣:output for a single column

但理想情況下,我希望跑上述在所有指定的列,在值列匹配,並填補了空白出0的命令。這可能在任何SQL實現?我目前正在使用SQLite,但我們處於一個相當開放的關係。

這是我的 '所需的' 輸出: enter image description here

+1

你想組由多個列的一個選擇? – 2015-04-28 15:25:42

+0

是的,我認爲是這樣 - 在這裏我寫了'價值',但在示例代碼中,實際上只是'col1'。在多列版本中,這不是列的值,而是所有列中唯一值的列表。我認爲解決方案在於找到這些獨特值的列表,並在整個表掃描過程中進行頻率計數,最後將結果放在上面。 –

回答

1

下面是一個使用子查詢一個選項與union all

select col, count(1) 
from (
    select col1 col from yourtable 
    union all 
    select col2 from yourtable 
    union all 
    select col3 from yourtable 
) t 
group by col 

鑑於你想要的結果S,或許這就是你要找的內容,而不是使用outer join有條件聚集:

select col, 
    sum(case when t1.col1 = col then 1 else 0 end) as Col1Count, 
    sum(case when t1.col2 = col then 1 else 0 end) as Col2Count, 
    sum(case when t1.col3 = col then 1 else 0 end) as Col3Count 
from (
    select col1 col from yourtable 
    union 
    select col2 from yourtable 
    union 
    select col3 from yourtable 
) t 
    left join yourtable t1 on t.col in (t1.col1, t1.col2, t1.col3) 
group by col 
+0

這非常酷 - 我可以看到這對其他類型的查詢非常有用 - 但是它總結所有值而不是每列都不回答OP。但仍然簡單,優雅,我喜歡SQL的所有東西:) 還爲小提琴+1:D –

+1

@ user3329564 - 抱歉,誤讀了您想要的結果。更新了答案。 – sgeddes

+1

@ user3329564 - 這裏有一個類似的方法與條件聚合:http://sqlfiddle.com/#!9/8cdab/8 – sgeddes