2012-11-20 20 views
3

我的角色與權限的表作爲這樣的:創建一個從對錶的輸出矩陣

role | permission  
r1 | p1 
r2 | p1 
r2 | p2 
r3 | p1 
r3 | p2 
r3 | p3 

我要的是一個輸出表,其中列(角色,然後每個權限) 。凡對許可/角色的表存在我想要一個1,它不存在我想要一個0

這裏是輸出:

role | p1 | p2 | p3 
r1 | 1 | 0 | 0 
r2 | 1 | 1 | 0 
r3 | 1 | 1 | 1 

這很容易,但這裏是kicker ... 既沒有角色或權限是固定長度的,可以隨時添加新的角色或權限,所以我需要將其考慮在內。

由於SQL的本質,我不認爲這是可能的,但我想我會問。

+0

請爲給定數據添加期望的輸出。哪個數據庫? – TechDo

+0

@techdo補充 - 謝謝。 – Cheetah

+1

這就是所謂的「旋轉表格」,以及它如何完成取決於 - 如techdo已經詢問的那樣 - 在使用的​​數據庫系統上。 – AndreKR

回答

1

您沒有指定您正在使用的RDBMS--所以這裏是MySQL和SQL Server的解決方案。

MySQL的:

這是一個PIVOT,但MySQL沒有一個PIVOT功能,所以你需要使用聚合函數和CASE語句來複制它。

靜態版本 - 在這裏,你知道所有的值事先:

select role, 
    sum(case when permission = 'p1' then 1 else 0 end) p1, 
    sum(case when permission = 'p2' then 1 else 0 end) p2, 
    sum(case when permission = 'p3' then 1 else 0 end) p3 
from yourtable 
group by role; 

SQL Fiddle with Demo

如果你不知道值轉向柱事先那麼你可以使用一個事先準備好的聲明:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'sum(case when permission = ''', 
     permission, 
     ''' then 1 else 0 end) AS ', 
     permission 
    ) 
) INTO @sql 
FROM yourtable; 

SET @sql = CONCAT('SELECT role, ', @sql, ' 
        FROM yourtable 
        GROUP BY role'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SQL Fiddle with Demo

SQL Server:

在sql server中有一個PIVOT函數,您可以對這些值進行硬編碼或使用動態sql。

靜態版本:

select * 
from 
(
    select role, permission 
    from yourtable 
) src 
pivot 
(
    count(permission) 
    for permission in ([p1], [p2], [p3]) 
) piv; 

SQL Fiddle with Demo

動態版本:

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

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

set @query = 'SELECT role, ' + @cols + ' from 
      (
       select role, permission 
       from yourtable 
      ) x 
      pivot 
      (
       count(permission) 
       for permission in (' + @cols + ') 
      ) p ' 

execute(@query) 

SQL Fiddle with Demo

結果所有版本是:

| ROLE | P1 | P2 | P3 | 
----------------------- 
| r1 | 1 | 0 | 0 | 
| r2 | 1 | 1 | 0 | 
| r3 | 1 | 1 | 1 |