0

アクションの発生を表す複数の列を持つテーブルがあります。

simpleTableExample

id  type $$$$$ value1 value2 value3 ... value15
--  ----  --   -----  -----  -----      -----
1    "I"   1    "a"    "b"    ""         ""
2    "O"   1    "a"    "d"    "f"        "z"
3    "I"   1    "d"    "b"    ""         ""
4    "O"   1    "g"    "l"    ""         ""
5    "I"   1    "z"    "g"    "a"         ""
6    "I"   1    "z"    "g"    "a"         "a"

データをどのように表現するかはよくわかりませんが、上記のように表示されます...行ごとに、グループ化する複数の列があります。「a」の部分に焦点を当てて、次のような出力が必要です。

Type     Value    Count  Sum
-----    -----    -----  ---
"I"      "A"      "3"     3
"O"      "A"      "2"     1

複数の列でグループ化する方法、または最善の方法がわからないだけです。シーケンス番号の付いた「背の高い」テーブルの場合は、簡単です...

私が心配していることの1つは、複数の行に同じ値があり(同じアクションが複数回実行されている)、列を積み重ねて行を合計しようとしている場合です。たとえば、行6には値がaの3と15があり、そのグループの合計をSum()しようとすると、6を2回カウントしたくありません(上に表示)

編集: ここで明確にしようとしています...私には「アクション」を持つ顧客の列があります。アクションは、value1からvalue15に折りたたまれます。「タイプ、値」グループの数を取得したい。

以前のカウントは間違っていました...特定のアクションの数ではなく、特定のアクションを実行した個別の顧客が必要です。したがって、上記の表示された表を使用すると、IAは4のカウントになるはずです。

私が思いついたものについてのファイナルノートコードレビューの質問。ピボットを解除して、一意の日付と値のペアのリストを作成します。

4

2 に答える 2

2

SQL 2005以降を想定すると、 UNPIVOTを使用してからGROUP BYとCOUNTを実行できます

于 2011-01-31T18:10:36.150 に答える
1

そのテーブルを第 1 正規形にして、それらの繰り返し列を子テーブルに分割するオプションはありますか? なぜ 1NF が良いのかという理論を脇に置くと、実際には、このような正規化されていない例では単純なクエリが難しくなるからです。

そうは言っても、この正規化されていないテーブルに行き詰まっている場合は、次のようなコードを作成する必要があります。

select type
     , 'A' as Column2
     , sum(case when value1='A' or value2='A' or.....
               then 1 else 0 end) as theCount
  from theTable
 group by type

「A」だけでなく複数の値を照会する場合は、クエリでテーブルをピボットする必要があります。これには、約 15 個のユニオンが含まれます。

select type,value,count(*) from (
    select type,value1 as value from theTable
    union all
    select type,value2 as value from theTable
    union all
    select type,value3 as value from theTable
    ...and so on...
) x
group by type,value
于 2011-01-31T18:09:45.143 に答える