2015-03-02 162 views
1

我希望完成的是在存儲過程中根據需要動態創建列。我的問題在於,一個驅動可能沒有激勵,1個激勵或多個(2,3,4.etc)激勵分配給驅動。下面的屏幕截圖例如數據:爲未知列數動態創建列

Example Data

我最初使用FOR XML路徑來連接記錄:

Stuff ((Select ', ' + isnull(EM.Description,'') 
    From EquipmentMaster EM 
     Inner Join EquipmentDetail ED On EM.EquipmentID = ED.EquipmentID And EM.EquipmentType=3 
     Where ED.DriveID = DM.DriveID 
      For XML PATH(''), TYPE).value('.', 'varchar(max)') 
      ,1, 2, '') as [Incentives] 

但最終用戶所要求的激勵機制是在單獨的列。我正在嘗試重新使用我在此處找到的一些代碼:Stack Overflow link

但是我無法使其工作。希望得到一些幫助,使這個過程的工作。

下面是程序代碼:

declare 
@startDate datetime, 
@endDate datetime, 
@RegID varchar(8000), 
@OrgID varchar(8000), 
@SubID varchar(8000), 
@COID varchar(8000), 
@RecID varchar(8000), 
@StatusID varchar(8000), 
@Cols nvarchar(max), 
@Incentives nvarchar(max) 

Select @Cols = Stuff ((Select ', ' + isnull(EM.Description,'') 
      From EquipmentMaster EM 
      Inner Join EquipmentDetail ED On EM.EquipmentID = ED.EquipmentID And EM.EquipmentType=3 
      --Where ED.DriveID = DM.DriveID 
      For XML PATH(''), TYPE).value('.', 'varchar(max)') 
      ,1, 2, '') 

Select 
DM.DriveID [DriveID], 
DM.FromDateTime [FromDateTime], 
Case When DM.OwnerType = 0 Then Acct.Name Else CD.DescLong End As [OwnerName], 

Stuff ((Select ', ' + isnull(EM.Description,'') 
    From EquipmentMaster EM 
     Inner Join EquipmentDetail ED On EM.EquipmentID = ED.EquipmentID And EM.EquipmentType=3 
     Where ED.DriveID = DM.DriveID 
      For XML PATH(''), TYPE).value('.', 'varchar(max)') 
      ,1, 2, '') as [Incentives] 
From 
rpt_DriveMaster DM 
Left Outer Join rpt_Accounts Acct on DM.AccountID=Acct.AccountID 
Left Outer Join IDViewRecruiters Rec on Acct.RecruiterID=Rec.CodeID 
Inner Join rpt_CenterDetail CD on DM.CenterID=CD.CenterID 

Where 
DM.StatusID <>5 
And DM.FromDateTime Between '03/01/2015' AND '03/02/2015' 

這是我的作品帶給所有激勵成一列(和使用SSRS顯示報表)原程序:

Create Procedure Hema_IncentiveReport 
@startDate datetime, 
@endDate datetime, 
@RegID varchar(8000), 
@OrgID varchar(8000), 
@SubID varchar(8000), 
@COID varchar(8000), 
@RecID varchar(8000), 
@StatusID varchar(8000) 

As 

Begin 

Select Item Into #Region From OBAPPS.[dbo].DelimitedSplit8K(@RegID,','); 
Select Item Into #OrgCenter From OBAPPS.[dbo].DelimitedSplit8k(@OrgID,','); 
Select Item Into #SubCenter From OBAPPS.[dbo].DelimitedSplit8k(@SubID,','); 
Select Item Into #CollectionOp From OBAPPS.[dbo].DelimitedSplit8k(@COID,','); 
Select Item Into #Recruiter From OBAPPS.[dbo].DelimitedSplit8k(@RecID,','); 
Select Item Into #DriveStatus From OBAPPS.[dbo].DelimitedSplit8k(@StatusID,','); 

Select 
DM.DriveID [DriveID], 
DM.FromDateTime [FromDateTime], 
Case When DM.OpenToPublic = 1 Then 'Yes' Else 'No' End As [OpenToPublic], 
Case When DM.OwnerType=0 Then 'Mobile' Else 'Fixed' End As [OwnerType], 
Case When DM.OwnerType = 0 Then Acct.Name Else CD.DescLong End As [OwnerName], 
DT.EarlyShiftStart [EarlyShiftStart], 
DT.LateShiftEnd [LateShiftEnd], 
DrStat.StatusText [DriveStatus], 
Acct.AccountID [AcctID], 
Acct.InternalName [AcctInternalName], 
Acct.ExternalID [ExternalID], 
AD.Addr1 [Addr1], 
AD.Addr2 [Addr2], 
AD.City [City], 
AD.State [State], 
AD.Zip [Zip], 
CO.CodeID [CO_ID], 
CO.Description [CO_Desc], 
Org.CodeID [Org_ID], 
Org.Description [Org_Desc], 
Rec.CodeID [Rec_ID], 
Rec.Description [Rec_Desc], 
Sub.CodeID [Sub_ID], 
Sub.Description [Sub_Desc], 
Reg.CodeID [Reg_ID], 
Reg.Description [Reg_Desc], 
DPaCT.ProcedureProjection [Proc_Proj], 
DPaCT.ProductProjection [Prod_Proj], 
DPaCT.ProceduresPerformed [Proc_Perf], 
DPaCT.ProductsCollected [Prod_Coll], 
DPaCT.QNS [QNS], 
DPaCT.FTD [FTD], 
(isnull(DPaCT.ProductsCollected,0))-(isnull(DPaCT.ProceduresPerformed,0)) [Alyx], 

Stuff ((Select Distinct ', ' + isnull(MSM.ShortDesc,'') 
    From Production.[dbo].rpt_DriveShiftDetail DSD 
     Inner Join Production.[dbo].rpt_DriveShiftMobileDetail DSMD On DSMD.ShiftID = DSD.ShiftID 
     Inner Join Production.[dbo].rpt_MobileSetupMaster MSM 
      On MSM.MobileType = 1 and MSM.MobileID = DSMD.MobileID 
      Where DSD.DriveID = DM.DriveID 
      For XML PATH(''), TYPE).value('.', 'varchar(max)') 
      ,1, 2, '') as [Mobile_Short_Desc], 

Stuff ((Select ', ' + isnull(EM.Description,'') 
    From Production.[dbo].EquipmentMaster EM 
     Inner Join Production.[dbo].EquipmentDetail ED On EM.EquipmentID = ED.EquipmentID And EM.EquipmentType=3 
     Where ED.DriveID = DM.DriveID 
      For XML PATH(''), TYPE).value('.', 'varchar(max)') 
      ,1, 2, '') as [Incentives] 

From 
Production.[dbo].rpt_DriveMaster DM 
Left Outer Join Production.[dbo].rpt_Accounts Acct on DM.AccountID=Acct.AccountID 
Inner Join Production.[dbo].DriveTimes DT on DM.DriveID=DT.DriveID 
Left Outer Join Production.[dbo].rpt_AddressDetail AD on DM.SiteID=AD.SiteID 
Left Outer Join Production.[dbo].IDViewRecruiters Rec on Acct.RecruiterID=Rec.CodeID 
Inner Join Production.[dbo].rpt_CenterDetail CD on DM.CenterID=CD.CenterID 
Inner Join Production.[dbo].IDViewCollectionOp CO on CD.CenterID=CO.CodeID 
Inner Join Production.[dbo].IDViewRegion Reg on CD.Region=Reg.CodeID 
Inner Join Production.[dbo].IDViewOrgCenter Org on CD.OrgCenter=Org.CodeID 
Inner Join Production.[dbo].IDViewOrgSubCenter Sub on CD.OrgSubCenter=Sub.CodeID 
Inner Join Production.[dbo].rpt_DriveStatusDef DrStat on DM.StatusID=DrStat.StatusID 
Inner Join Production.[dbo].DriveProjectionandCollectedTotals DPaCT on DM.DriveID=DPaCT.DriveID 
Inner Join #Region As Region On Reg.CodeID = Region.Item 
Inner Join #OrgCenter As OrgCenter on Org.CodeID = OrgCenter.Item 
Inner Join #SubCenter As SubCenter on Sub.CodeID = SubCenter.Item 
Inner Join #CollectionOp as CollectionOp on CO.CodeID = CollectionOp.Item 
Left Outer Join #Recruiter as Recruiter on Rec.CodeID = Recruiter.Item 
Inner Join #DriveStatus as DriveStatus on DrStat.StatusID = DriveStatus.Item 

Where 

DM.StatusID <>5 
And DM.FromDateTime Between @startDate AND @endDate 
+0

您是否嘗試在靜態版本中直接寫入動態SQL之前先編寫此代碼?這可以讓你得到正確的邏輯,然後轉換它。 – Taryn 2015-03-02 16:40:14

+0

是的,靜態版本的作品。我的程序是正確的,我現在試圖將其轉換爲動態SQL以將激勵分爲單獨的列。 – MISNole 2015-03-02 16:41:46

+0

你可以編輯顯示你的靜態版本嗎?然後我們可以將其與您的動態版本進行比較以查看任何問題。 – Taryn 2015-03-02 16:51:36

回答

0

我將該表重新創建爲矩陣,並在「驅動器ID」字段中創建一個行分組。然後我在激勵字段上創建了一個列組,並將其值設置爲: =IIF(IsNothing(Fields!Incentive.Value),True,False)