0

次のような Data というデータベースがあります。

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

NULL 行も表示されました。COUNT(Weakness1)>0 は 'where' の後に許可されず、既に 'DISTINCT' を追加しましたが、弱点が冗長であることがわかりました

したがって、次のように表示されます:

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

ここで何か問題がありますか?ありがとうございました

4

3 に答える 3

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

于 2015-12-22T04:57:00.520 に答える
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
于 2015-12-22T06:51:40.300 に答える
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
于 2015-12-22T05:21:36.373 に答える