1

こんにちは、

この質問のようにCASEを使用して、行を列に転置しようとしています。

行から列へSQLServerクエリ

ただし、私の場合、データの数である情報を含む列がありません。

このクエリでデータを取得します。

select MA, SN, count(*) 
from Original
where MA = 'AB'
group by MA

クエリの結果:

MA  SN      COUNT
AB  TEXTA   6
AB  TEXTB   5
AB  TEXTC   3
AB  TEXTD   4

テーブルオリジナル

MA  SN      
AB  TEXTA   
AB  TEXTA   
AB  TEXTA   
AB  TEXTA   
AB  TEXTA   
AB  TEXTA   
.
.
.
AB  TEXTD   
AB  TEXTD   

テーブル結果:

MA      TEXTA   TEXTB   TEXTC   TEXTD
AB      6       5       3       4

そして、これは私の現在のクエリです:

select  MA,
        count(*) as 'COUNT2',
    MAX(CASE WHEN SN = 'TEXTA' THEN COUNT2 end) as TEXTA1,
    MAX(CASE WHEN SN = 'TEXTB' THEN COUNT2 end) as TEXTB1,
    MAX(CASE WHEN SN = 'TEXTC' THEN COUNT2 end) as TEXTC1,
    MAX(CASE WHEN SN = 'TEXTD' THEN COUNT2 end) as TEXTD1,

from Original
where MA= 'AB'
group by MA

クエリでひどく間違っているのはなぜですか。そして、誰かが私が投稿した質問でそれが機能するがカウントでは機能しない理由を説明できますか?ありがとうございました!:)。

4

1 に答える 1

4

編集:COUNT2選択リストの後の列は前の列のエイリアスを参照できないため、意図した方法では使用できません。したがってCOUNT2、その部分をサブクエリ (または cte) に変換してから参照しない限り、クエリの他の場所では意味がありません。

したがって、更新されたスキーマでは、カウントを行うためにサブクエリが必要になることは理にかなっています。基本的に、最初のクエリを 2 番目のクエリのサブクエリとして削除し (の代わりに)、不足している列をOriginalいくつか追加すると、次のように機能します。group by

select  MA,
    MAX(CASE WHEN SN = 'TEXTA' THEN COUNT2 end) as TEXTA1,
    MAX(CASE WHEN SN = 'TEXTB' THEN COUNT2 end) as TEXTB1,
    MAX(CASE WHEN SN = 'TEXTC' THEN COUNT2 end) as TEXTC1,
    MAX(CASE WHEN SN = 'TEXTD' THEN COUNT2 end) as TEXTD1
from (
    select MA, SN, count(*) as COUNT2
    from Original
    where MA = 'AB'
    group by MA, SN
) Original
where MA= 'AB'
group by MA

http://www.sqlfiddle.com/#!3/41c79/7

于 2012-08-30T13:17:17.723 に答える