簡體   English   中英

SQL Server查詢將行分組為列並獲得相應的名稱

[英]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)

參見帶有演示的SQL Fiddle

兩者都給出結果:

| 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM