2014-01-20 84 views
0

我有動態透視列的查詢, 我需要工會也有我的grandtotal在底部, 問題是列在底部數成爲聯合不等於具有數據透視列的列數。我如何將列添加到我的grandtotal列中以在pivot列上進行聯合,以便它們可以聯合?如何動態空字段添加爲列在SQL Server

ALTER procedure [dbo].[davehot] 
     (
     @article as varchar(10) 
     ) 
     as 
     begin 
     DECLARE @sizenameS NVARCHAR (MAX) 
     SELECT @sizenameS = COALESCE(@sizenameS + ', ','') + QUOTENAME(SizeName) 
     FROM 
     ( select DISTINCT SIZESET.SizeSetID, SizeName 
    from SIZESET 
    left join SHIPMENTSIZESET ON SIZESET.SizeSetID = SHIPMENTSIZESET.SizeSetID 
    left join SHIPMENTSCHED on SHIPMENTSCHED.ShipmentSchedID = SHIPMENTSIZESET.ShipmentSchedID 
    left join DESIGN on DESIGN.DesignID = SIZESET.DesignID 
    left join ARTICLE on ARTICLE.DesignID = DESIGN.DesignID where ArticleNo = @article 
)src2 
ORDER BY SizeSetID 


DECLARE @DownDownDown NVARCHAR (MAX) 

SELECT @DownDownDown = COALESCE(@DownDownDown + 'ISNULL([' + CAST (SizeName AS VARCHAR) +'],0) + ', 'ISNULL([' + CAST(SizeName AS VARCHAR)+ '],0) + ') 
    FROM 
    ( select DISTINCT SIZESET.SizeSetID, SizeName 
     from SIZESET 
     left join SHIPMENTSIZESET ON SIZESET.SizeSetID = SHIPMENTSIZESET.SizeSetID 
     left join SHIPMENTSCHED on SHIPMENTSCHED.ShipmentSchedID = SHIPMENTSIZESET.ShipmentSchedID 
     left join DESIGN on DESIGN.DesignID = SIZESET.DesignID 
     left join ARTICLE on ARTICLE.DesignID = DESIGN.DesignID where ArticleNo = @article 
    )src3 
    ORDER BY SizeSetID 
SET @DownDownDown = LEFT (@DownDownDown, LEN (@DownDownDown)-1) 



DECLARE @ToTheLeft NVARCHAR(MAX) 
SELECT @ToTheLeft = COALESCE(@ToTheLeft + ',SUM([' + CAST(SizeName AS VARCHAR)+'])', 'SUM([' + CAST(SizeName AS VARCHAR)+'])') 
    FROM 
    ( select DISTINCT SIZESET.SizeSetID, SizeName 
     from SIZESET 
     left join SHIPMENTSIZESET ON SIZESET.SizeSetID = SHIPMENTSIZESET.SizeSetID 
     left join SHIPMENTSCHED on SHIPMENTSCHED.ShipmentSchedID = SHIPMENTSIZESET.ShipmentSchedID 
     left join DESIGN on DESIGN.DesignID = SIZESET.DesignID 
     left join ARTICLE on ARTICLE.DesignID = DESIGN.DesignID where ArticleNo = @article 
    )src 
    ORDER BY SizeSetID 


    Declare @price nvarchar(max) 
select @price = COALESCE(@price + ',' +''''+ CAST(Price AS VARCHAR)+'''', '''' + CAST(Price AS VARCHAR)+'''') 
    FROM 
    ( select price from pricesizeset 
    join article on ARTICLE.ControlNo = PRICESIZESET.ControlNo 
    where ARTICLE.ArticleNo = @article 
    )price 

DECLARE @TOTPRICE nvarchar(max) 
declare @grandtotal nvarchar(max) 
    select @grandtotal = coalesce(@grandtotal + ', ', cast(sum(total) as nvarchar)) 
     from(
      select (price*quantity) as total 
      from 
      (
       SELECT distinct(SIZESET.SizeSetID),price, sum(quantity) as [quantity] 

       FROM SIZESET LEFT JOIN PRICESIZESET ON PRICESIZESET.SizeSetID = SIZESET.SizeSetID 
       JOIN ARTICLE ON ARTICLE.ControlNo = PRICESIZESET.ControlNo JOIN DESIGN ON DESIGN.DesignID = ARTICLE.DesignID 
       JOIN SHIPMENTSIZESET ON SIZESET.SizeSetID = SHIPMENTSIZESET.SizeSetID 
       WHERE ARTICLE.ArticleNo = 'EZT02' 
       GROUP BY SIZESET.SizeSetID, price 
      )tab 
     )TOTPRICE 
     select(@grandtotal) 





DECLARE @JerryPogi NVARCHAR (MAX) 
SET @JerryPogi = 'SELECT *, ('+ @DownDownDown + ') AS [Date Total] INTO #Pansamantala 
      FROM 
      (
       select DISTINCT ShipmentSched.ShipmentSchedId, CONVERT(varchar(10), StartDate, 110) as [Start Date], CONVERT(varchar(10), EndDate, 110) as [End Date], SizeName, Quantity 
       from SIZESET 
       left join SHIPMENTSIZESET ON SIZESET.SizeSetID = SHIPMENTSIZESET.SizeSetID 
       left join SHIPMENTSCHED on SHIPMENTSCHED.ShipmentSchedID = SHIPMENTSIZESET.ShipmentSchedID 
       left join DESIGN on DESIGN.DesignID = SIZESET.DesignID 
       left join ARTICLE on ARTICLE.DesignID = DESIGN.DesignID where ArticleNo = '''[email protected]+''' 
      ) JerryGwapo 
      PIVOT 
      (
       SUM(Quantity) 
       FOR SizeName 
       IN('[email protected] +') 
      ) JerryHot 
      ORDER BY [Start Date] 

      SELECT * FROM #Pansamantala 
      UNION ALL 
      SELECT '''','''',''Size Total'','[email protected] +', isnull(SUM([Date Total]),0) FROM #Pansamantala 
      UNION ALL 
      SELECT 
      '''', '''','''','[email protected]+','''' 
      union 
      select 
      '''','''','''','[email protected] +','''' from #pansamantala 

      DROP TABLE #Pansamantala' 

      exec(@JerryPogi) 
end 

exec davehot'EZT02' 

回答

0

做到這一點,最簡單的方法是用整數值設置爲變量來計數@sizenameS和@DownDownDown條目數。然後,使用REPLICATE(''''',', number)

開始通過聲明兩個int變量:

DECLARE @countS INT 
DECLARE @countD INT 

店創建列定義後直接記錄到這些變量的數目:

SELECT @sizenameS = COALESCE(@sizenameS + ', ','') + QUOTENAME(SizeName) 
    FROM 
    ( select DISTINCT SIZESET.SizeSetID, SizeName 
    from SIZESET 
    left join SHIPMENTSIZESET ON SIZESET.SizeSetID = SHIPMENTSIZESET.SizeSetID 
    left join SHIPMENTSCHED on SHIPMENTSCHED.ShipmentSchedID = SHIPMENTSIZESET.ShipmentSchedID 
    left join DESIGN on DESIGN.DesignID = SIZESET.DesignID 
    left join ARTICLE on ARTICLE.DesignID = DESIGN.DesignID where ArticleNo = @article 
    )src2 
    ORDER BY SizeSetID 
    SET @countS = @@ROWCOUNT 

做同樣的事情@DownDownDown

而且,您的最終SQL語句將爲:

SET @JerryPogi = 'SELECT *, ('+ @DownDownDown + ') AS [Date Total] INTO #Pansamantala 
      FROM 
      (
       select DISTINCT ShipmentSched.ShipmentSchedId, CONVERT(varchar(10), StartDate, 110) as [Start Date], CONVERT(varchar(10), EndDate, 110) as [End Date], SizeName, Quantity 
       from SIZESET 
       left join SHIPMENTSIZESET ON SIZESET.SizeSetID = SHIPMENTSIZESET.SizeSetID 
       left join SHIPMENTSCHED on SHIPMENTSCHED.ShipmentSchedID = SHIPMENTSIZESET.ShipmentSchedID 
       left join DESIGN on DESIGN.DesignID = SIZESET.DesignID 
       left join ARTICLE on ARTICLE.DesignID = DESIGN.DesignID where ArticleNo = '''[email protected]+''' 
      ) JerryGwapo 
      PIVOT 
      (
       SUM(Quantity) 
       FOR SizeName 
       IN('[email protected] +') 
      ) JerryHot 
      ORDER BY [Start Date] 

      SELECT * FROM #Pansamantala 
      UNION ALL 
      SELECT '''','''',''Size Total'','[email protected] +', isnull(SUM([Date Total]),0) FROM #Pansamantala 
      UNION ALL 
      SELECT 
      '''', '''','''','[email protected]+','''' 
      union 
      select 
      '''','''',''''' + REPLICATE(',''''', @countS) + ',' [email protected] + ' from #pansamantala' 
+0

好的,我會嘗試:) – Dave

+0

請注意,我的解決方案不是100%準確。我只提供一個指導方針。我甚至可以看到,我沒有將REPLICATE添加到UNION語句之一。請微調它 – cha

+0

請注意,我已經更新了我的答案。 REPLICATE實際上應該有這樣的語法:'REPLICATE('''',',number)' – cha