2016-10-10 18 views
3

我處理的一個設計不當表,有點像這個在PostgreSQL中

create table (
    entity_key integer, 
    tag1  varchar(10), 
    tag2  varchar(10), 
    tag3  varchar(10), 
    ... 
    tag25  varchar(10) 
); 

一個實體可以通過非空的數字表示0或多個標籤與一個設計不當的「變量列」表處理列。標籤都是相同的類型,並且應該有一個單獨的「標籤」表,我們可以將其加入主要實體。

但是,我堅持這個(相當大)的表。

我想運行一個查詢,給我不同的標籤和每個的計數。

如果我們有範「標籤」表中,我們可以簡單地寫

select tag, count(tag) from tags group by tag; 

不過,我還沒有想出了給定當前的表結構此查詢一個不錯的辦法。

回答

3

可以unpivot的的數據,並做count

select tag,count(data) 
from 
(
select tag1 as data,'tag1' as tag 
from yourtable 
Union All 
select tag2,'tag2' as tag 
from yourtable 
Union All 
.. 
select tag25,'tag25' as tag 
from yourtable 
) A 
Group by tag 

如果PostgreSQL支持​​運營商,那麼你可以使用

5

你可以這樣使用數組和UNNEST:

select x.tag, count(*) 
from tags 
    cross join lateral unnest(array[tag1, tag2, tag3, tag4, tag5, tag6, tag7, ...]) as x(tag) 
where x.tag is not null --<< git rid of any empty tags 
group by x.tag; 

這將組內容的標籤列不同於Prdp的回答,它由列表中的「位置」分組。

對於此樣本數據:

insert into tags (entity_key, tag1, tag2, tag3, tag4, tag5) 
values 
(1, 'sql', 'dbms', null, null, null), 
(2, 'sql', 'dbms', null, null, 'dml'), 
(3, 'sql', null, null, 'ddl', null); 

這將返回此:

tag | count 
-----+------ 
dml |  1 
ddl |  1 
sql |  3 
dbms |  2