您沒有指定您正在使用的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 |
請爲給定數據添加期望的輸出。哪個數據庫? – TechDo
@techdo補充 - 謝謝。 – Cheetah
這就是所謂的「旋轉表格」,以及它如何完成取決於 - 如techdo已經詢問的那樣 - 在使用的數據庫系統上。 – AndreKR