如何使Dynamic Pivot Column-row值有条件

时间:2014-10-24 19:41:49

标签: sql

我有几个表格,例如

dbo.ServiceEntry(ID,SystemID)
dbo.ServiceEntryPart(ID,PartID,ServiceEntryID,RevisionNumber)
dbo.Part(ID,Description,..,..,InstrumentTypeID,PlatformID,BaseLineNumber)
dbo.Sytem(ID,FullName,PlatformID)
dbo.SystemModule(ID,SystemID,InstrumentTypeID)
dbo.InstrumentType(ID,Name)

我编写了一个动态数据透视查询,它返回在服务条目中使用并具有修订号的部分。所以基本上是在系统上创建服务条目,并且在该服务条目中选择了部分,并且用户为所选部分添加了修订号

所以结果如下所示

PartID  PartDescription  System1  System2  System3
1020    xyz              NULL      102      NULL

现在我需要在查询中添加条件,如果零件没有匹配的服务条目,那么我将使用零件表中的零件基线编号替换枢轴列 - 行值,而不是服务条目中的修订版号零件表

基本上如上所述,如果部件1020未在服务条目中使用,则结果将如下所示,其中系统列行值是部件表中的部件基线编号。系统3值不会填充基线修订号,因为该部分不属于该系统。

PartID  PartDescription    System1  System2  System3
    1020    xyz               100      100      NULL

那么如何在现有的动态数据透视查询中添加上述条件呢?

    DECLARE @PivotColumnHeaders NVARCHAR(MAX)

        SELECT @PivotColumnHeaders =  
           COALESCE(
             @PivotColumnHeaders + ',[' +  cast(SystemFullName as Nvarchar) + ']',
             '[' + cast(SystemFullName as varchar)+ ']'
           )
        FROM System

    DECLARE @PivotTableSQL NVARCHAR(MAX)
    SET @PivotTableSQL = N'
       SELECT *
       FROM (

        select p.HighLevelPart as Subsystem,
        p.ID as PartNumber,p.PartDescription as Description,
         s.SystemFullName,
          sep.PartRevisionNumber AS Revision from ServiceEntry se
        inner join ServiceEntryPart sep
        on sep.ServiceEntryID = se.ID
        inner join Part p on
        sep.PartID = p.ID
        inner join System s on
        se.SystemID = s.ID
        and p.HighLevelPart is not null
        and sep.PartRevisionNumber is not null
) AS PivotData
   PIVOT (
     MAX(Revision)
     FOR SystemFullName IN (
       ' + @PivotColumnHeaders + '
     ) 
   ) AS PivotTable   
' 
exec sp_executesql @PivotTableSQL

0 个答案:

没有答案