0

我有一个带有名称tbl_Criteria的表,此处可用的列是 ID、名称。
样本记录如下

D        Name
1        Lunch
2        Dinner

我有另一个表,其名称tbl_Feedback的列如下所示

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

我的需要是我需要将 creteria 列表显示为列,并且我需要给出如下所示的评级

Dinner  Lunch
A       C
B       Null

希望这很清楚。如果不是,请告诉我。

4

1 回答 1

0

当您将数据从行转入列时,有几种方法可以做到这一点。您可以使用带有 CASE 表达式的聚合函数,或者由于您使用的是 SQL Server,您可以使用 PIVOT 函数。在这两种情况下,您都将使用 group by 应用某种聚合。

由于您只想显示ratingsname,因此如果将聚合函数应用于字符串列,则在使用 时将返回一行GROUP 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。但是如果你运行上面的查询,你只会返回一行:

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

因此,您需要包含一些允许在最终结果中包含不同行的值。由于您使用的是 SQL Server,因此您可以应用row_number(). 如果包含 a ,则可以按类似于以下内容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 生成应用分组依据时所需的唯一值。

您还可以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 回答