當您將數據從行轉移到列時,有幾種方法可以執行此操作。你可以在CASE表達式中使用聚合函數,或者因爲你使用的是SQL Server,你可以使用PIVOT函數。在這兩種情況下,你都會應用某種聚合。
由於您只是想顯示ratings
和name
,如果將聚合函數應用於字符串列,那麼在使用GROUP BY
時將返回一行。
使用聚合函數的情況進行的語法:
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()
。如果包括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()
:
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 with Demo
感謝您的答覆先生。 你剛纔在select語句中提到了「Lunch」和「Dinner」作爲硬編碼。但是我可以在該表中插入更多記錄tbl_createria.I需要選擇並顯示我已插入tbl_creteria中作爲列的記錄。希望這是明確的先生。請讓我知道如果這不是。 – user2003780
@ user2003780查看我的編輯,如果值未知,您將不得不使用動態sql來獲取結果。 – Taryn