0

名前のテーブルがあり、tbl_Criteriaここで使用できる列は ID 、 Name です。
サンプルレコードを以下に示します

D        Name
1        Lunch
2        Dinner

tbl_Feedback以下に示す列を持つ名前の別のテーブルがあります

ID      UserID    Creteria      Ratings
1        129         2            A
2        329         2            B
3        520         1            C

私の必要性は、クレテリアのリストを列として表示する必要があり、以下に示すように評価を与える必要があることです

Dinner  Lunch
A       C
B       Null

これが明確であることを願っています。そうでない場合はお知らせください。

4

1 に答える 1

0

行から列にデータをピボットする場合、これを行う方法がいくつかあります。CASE 式で集計関数を使用することも、SQL Server を使用しているため、PIVOT 関数を使用することもできます。どちらの場合も、group by を使用して何らかの集計を適用します。

と を表示したいだけなので、文字列列に集計関数を適用すると、 を使用すると 1 行が返されratingsます。nameGROUP BY

CASE で集計関数を使用する構文は次のようになります。

select 
  max(case when name = 'Dinner' then ratings end) Dinner,
  max(case when name = 'Lunch' then ratings end) Lunch
from tbl_feedback f
inner join tbl_criteria c
  on f.creteria = c.d;

SQL Fiddle with Demoを参照してください。しかし、上記のクエリを実行すると、1 行しか返されません。

| DINNER | LUNCH |
------------------
|      B |     C |

したがって、個別の行を最終結果に含めることができる値を含める必要があります。SQL Server を使用しているため、row_number(). を含めると、次row_number()のようにデータを分割できます。creteria

select 
  max(case when name = 'Dinner' then ratings end) Dinner,
  max(case when name = 'Lunch' then ratings end) Lunch
from
(
  select f.ratings, c.name, 
    row_number() over(partition by f.creteria order by f.id) rn
  from tbl_feedback f
  inner join tbl_criteria c
    on f.creteria = c.d
) d
group by rn;

SQL Fiddle with Demoを参照してください。row_number は、group by を適用するときに必要な一意の値を生成します。

row_number()PIVOT 関数を使用するときにも使用できます。

select dinner, lunch
from
(
  select f.ratings, c.name, 
    row_number() over(partition by f.creteria order by f.id) rn
  from tbl_feedback f
  inner join tbl_criteria c
    on f.creteria = c.d
) d
pivot
(
  max(ratings)
  for name in (dinner, lunch)
) piv;

SQL Fiddle with Demoを参照してください。これらのクエリの最終結果は次のようになります。

| DINNER |  LUNCH |
-------------------
|      A |      C |
|      B | (null) |

編集#1:条件名の数が不明または動的な場合は、動的SQLを使用して結果を生成する必要があります。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(name) 
                    from tbl_Criteria
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT ' + @cols + ' 
            from 
             (
                select f.ratings, c.name, 
                  row_number() over(partition by f.creteria order by f.id) rn
                from tbl_feedback f
                inner join tbl_criteria c
                  on f.creteria = c.d
            ) d
            pivot 
            (
                max(ratings)
                for name in (' + @cols + ')
            ) p '

execute(@query)

デモで SQL Fiddle を参照してください

于 2013-06-03T10:17:10.240 に答える