[英]SQL Server query for grouping row as column and getting corresponding designation
我在SQL Server中有2個表:
表1: 部門
DeptId Dept Name
------------------
1 Software Development
2 Testing
3 Customization
表2: 名稱
DesigId Desig Name DeptId
---------------------------
1 TL 1
2 PL 1
3 TestEngg 2
4 SE 3
我想要以下輸出,將部門作為列標題,並在相應的部門列下指定組,
Software Development Testing Customization
TL TestEngg SE
PL
我嘗試使用以下查詢,但我只能獲取ID
DECLARE @deptcols AS VARCHAR(MAX);
DECLARE @querystr AS VARCHAR(MAX);
select @deptcols = STUFF((SELECT distinct ',' + QUOTENAME(Dept_Id)
FROM Designation
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @querystr = 'SELECT ' + @deptcols + ' from
(
select Desig_Name, Dept_Id,Desig_Id
from Designation
) p
pivot
(
count(Desig_Id) FOR Dept_Id in (' + @deptcols + ')
) pv '
execute(@querystr)
我認為PIVOT關鍵字是您應該在這里使用的關鍵字。 PIVOT可用於轉換數據集,以使列成為行。
無需構造動態查詢
看一下這篇文章: http : //archive.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=PIVOTData
詳細信息: http : //msdn.microsoft.com/zh-cn/library/ms177410(v=sql.105).aspx
您的代碼非常接近。 在使用PIVOT
尤其是動態版本時,我的建議是先編寫靜態版本,然后將其轉換為動態sql。
靜態版本中,您可以對值進行硬編碼,如下所示:
SELECT [Software Development], [Testing], [Customization]
from
(
select d.[Dept Name],
s.[Desig Name],
row_number() over(partition by s.deptid order by s.desigid) rn
from Designation s
left join department d
on s.[DeptId] = d.[DeptId]
) p
pivot
(
max([Desig Name])
FOR [Dept Name] in ([Software Development], [Testing], [Customization])
) pv
請參閱帶有演示的SQL Fiddle 。 靜態版本使您可以確保語法正確,並且所有值,列等均位於正確的位置。
然后,一旦有了語法,就可以輕松轉換為動態SQL版本:
DECLARE @deptcols AS VARCHAR(MAX)
DECLARE @querystr AS VARCHAR(MAX)
select @deptcols = STUFF((SELECT ',' + QUOTENAME([Dept Name])
FROM Department
GROUP BY [Dept Name], DeptId
ORDER BY DeptId
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @querystr =
'SELECT ' + @deptcols + ' from
(
select d.[Dept Name],
s.[Desig Name],
row_number() over(partition by s.deptid order by s.desigid) rn
from Designation s
left join department d
on s.[DeptId] = d.[DeptId]
) p
pivot
(
max([Desig Name])
FOR [Dept Name] in (' + @deptcols + ')
) pv '
execute(@querystr)
兩者都給出結果:
| SOFTWARE DEVELOPMENT | TESTING | CUSTOMIZATION |
---------------------------------------------------
| TL | TestEngg | SE |
| PL | (null) | (null) |
您會注意到,我在SELECT
語句中添加了row_number() over(partition by s.deptid order by s.desigid) rn
行。 這使您可以返回多個Desig Name
為每個Dept Name
,如果沒有這個,你將只返回一個值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.