当您将数据从行转入列时,有几种方法可以做到这一点。您可以使用带有 CASE 表达式的聚合函数,或者由于您使用的是 SQL Server,您可以使用 PIVOT 函数。在这两种情况下,您都将使用 group by 应用某种聚合。
由于您只想显示ratings
和name
,因此如果将聚合函数应用于字符串列,则在使用 时将返回一行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