2013-06-03 98 views
0

我有一個名稱爲tbl_Criteria的表格,這裏可用的列是ID,Name。
和樣品記錄下面給出在SQL Server中以表格的形式顯示記錄

D  Name 
1  Lunch 
2  Dinner 

我有,它們是具有如下

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

我的需要,因爲在給定列名tbl_Feedback是我需要顯示的列表中的另一表creteria作爲列,我需要給收視率 下面

Dinner Lunch 
A  C 
B  Null 

給出希望這是明確的。請讓我知道如果這不是。

回答

0

當您將數據從行轉移到列時,有幾種方法可以執行此操作。你可以在CASE表達式中使用聚合函數,或者因爲你使用的是SQL Server,你可以使用PIVOT函數。在這兩種情況下,你都會應用某種聚合。

由於您只是想顯示ratingsname,如果將聚合函數應用於字符串列,那麼在使用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

+0

感謝您的答覆先生。 你剛纔在select語句中提到了「Lunch」和「Dinner」作爲硬編碼。但是我可以在該表中插入更多記錄tbl_createria.I需要選擇並顯示我已插入tbl_creteria中作爲列的記錄。希望這是明確的先生。請讓我知道如果這不是。 – user2003780

+0

@ user2003780查看我的編輯,如果值未知,您將不得不使用動態sql來獲取結果。 – Taryn