2014-01-20 44 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