2015-12-22 24 views
0

工作我有數據庫稱爲數據,如下列:鮮明SQL不與UNNEST和ARRAY

ID | Name | Weakness1 | Weakness2 | Weakness3 
_____________________________________________ 
1 | A | W1  |  W2 | Null 
2 | B | NULL |  W2 | W3 
3 | C | W1  |  NULL | NULL 
4 | A | W1  |  W2 | W3 
5 | A | W1  |  NULL | NULL 

,我想查詢,以便它可以顯示像:

Name | Weakness  | Frequency 
___________________________________ 
    A | W1   | 3 
    A | W2   | 2 
    A | W3   | 1 

注意同名可以有不同的ID。到目前爲止,我試過的代碼:

Select DISTINCT Name, 
UNNEST(ARRAY[weakness1,weakness2,weakness3] as Weakness, 
UNNESR(ARRAY[count(weakness1),count(weakness2),count(weakness2)]) 
from data 
where agentname like '%A%' 
GROUP by agentname,weakness1,weakness2,weakness3 

我得到了一個N​​ULL行也顯示。 COUNT(Weakness1)> 0不後「其中」允許和我的弱點是多餘的,雖然我已經添加了「獨特」

所以它顯示像:

Name | Weakness  | Frequency 
___________________________________ 
    A | W1   | 1 
    A |     | 0 
    A | W3   | 1 
    A | W1   | 2 
    A | W2   | 1 
    A | W2   | 1 

有什麼問題嗎?謝謝

回答

1

你能試試這樣的事嗎?

with data as (
    select name, weakness1 as weakness from tablename 
    union all 
    select name, weakness2 as weakness from tablename 
    union all 
    select name, weakness3 as weakness from tablename 
) 
select name, weakness, count(*) 
from data 
where name like '%A%' and weakness is not null 
group by name, weakness 

結果

| name | weakness | count | 
|------|----------|-------| 
| A |  W1 |  3 | 
| A |  W3 |  1 | 
| A |  W2 |  2 | 

實施例:http://sqlfiddle.com/#!15/7e4aa/3

替代方法:

select name, weakness, count(*) from (
    select name, unnest(array[weakness1, weakness2, weakness3]) as weakness 
    from tablename 
) t 
where name like '%A%' and weakness is not null 
group by name, weakness; 

實施例:http://sqlfiddle.com/#!15/7e4aa/6

+0

替代方法的作品!謝謝 – Elbert

0
SELECT NAME 
    ,unnest(regexp_split_to_array(concat_ws(',', weak1, weak2, weak3), ',')) weakness 
    ,count(unnest(regexp_split_to_array(concat_ws(',', weak1, weak2, weak3), ','))) frequency 
FROM dat 
WHERE NAME = 'A' -- or use WHERE NAME like '%A%' 
GROUP BY 2,1 
0

找到這個

select Name,Weakness1 as weakness,count(Weakness1) from data 
    where name ='A' group by name,weakness1 

    Union all 

    select Name,Weakness2 as weakness,count(Weakness2) from data 
    where name ='A' and Weakness2 ='W2' group by name,weakness2 

    union all 

    select Name,Weakness3 as weakness,count(Weakness3) from data 
    where name ='A' and Weakness3 ='W3' group by name,weakness3