2016-09-21 132 views
1

请帮我这个。我拥有的数据是:SQL Server:枢轴

ID   Name   TotalCost IsCorporate   
---- ---------------- ---------- ----------- 
1  Wash, Dry & Fold  175.00  1 
2  Hand Wash and Fold 275.00  0 
3  Pressing Only   25.00  0 
4  Hand Wash and Fold 205.00  1 
5  Pressing Only   100.00  0 

如果IsCorporate = 0那么Total Cost将调整到Corporate列如下:

ID Wash, Dry & Fold Hand Wash and Fold Pressing Only Corporate 
---- ---------------- ----------------- -------------- ----------- 
1   175.00  
2               275.00 
3               25.00             
4      205.00     
5               100.00            

这是我的存储过程的代码:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[ReportSales] 
AS 
BEGIN 
    SELECT 
     IDJO, ISCORP, ST.[Wash, Dry & Fold], ST.[Pressing Only], 
     ST.[Dry Clean], ST.[Hand Wash and Fold], ST.[Wash, Dry & Press], 
     ST.[Stain Removal], ST.[Hand Wash and Press], CORPORATE 
    FROM 
     (SELECT 
      JO.Id AS IDJO, CI.Active AS ISCORP, ST.Name, 
      ISNULL(JO.TotalCost, 0) AS TC 
     FROM 
      JobOrders JO 
     INNER JOIN 
      ClientInformations CI ON JO.ClientId = CI.Id 
     INNER JOIN 
      JobOrderDetails JOD ON JO.Id = JOD.JOrderId 
     INNER JOIN 
      ServiceTypes ST ON JOD.ServiceId = ST.Id 
     INNER JOIN 
      Payments P ON JO.Id = P.JobOrderId 
     INNER JOIN 
      PaymentStatus PS ON JO.PaymentStatusId = PS.Id 
     INNER JOIN 
      Status S ON JO.StatusId = s.Id) AS J 
    PIVOT 
     (SUM(TC) for Name IN ([Wash, Dry & Fold], [Pressing Only], [Dry 
Clean], [Hand Wash and Fold], [Wash, Dry & Press], [Stain Removal], 
[Hand Wash and Press], [Corporate]) ) AS ST 
END 
+0

我不明白这是一个真正的动态支点,但你会有一个更容易的时间使用条件聚合超过PIVOT IMO。例如'SELECT SUM(案例当名称='洗涤,干燥和折叠'和isCorporate = 1 THEN TC END),SUM(CASE WHEN名称='仅按'...'等等与另一个'SUM(CASE WHEN isCorporate = 0 THEN TC END)' – ZLK

回答

0

使用动态列集合来选择PIVOT数据,因为它给你任何新的列值增加在t能,假设后2-3天,如果新名称说为XYZ在你的餐桌补充甚至,它显示新列PIVOT结果:

CREATE TABLE ReportSales 
(
    ID INT, 
    Name VARCHAR(50), 
    TotalCost DECIMAL(10,2), 
    IsCorporate BIT 
) 

INSERT INTO ReportSales VALUES(1,'Wash, Dry & Fold',175.00,1) 
,(2,'Hand Wash and Fold',275.00,0) 
,(3,'Pressing Only',25.00,0) 
,(4,'Hand Wash and Fold',205.00,1) 
,(5,'Pressing Only',100.00,0) 

DECLARE @Name AS NVARCHAR(MAX),@Query AS NVARCHAR(MAX); 

SET @Name = STUFF((SELECT distinct ',' + QUOTENAME(Name) 
      FROM ReportSales c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

SET @Query =  
'IF OBJECT_ID(''tempdb..#tblRS'') IS NOT NULL 
DROP TABLE #tblRS 

SELECT 
    ID, 
    RS.Name, 
    TotalCost, 
    ISCorporate, 
    CASE RS.IsCorporate WHEN 1 THEN 0 ELSE RS.TotalCost END AS Corporate 
INTO #tblRS 
FROM ReportSales RS 

SELECT ID, ' + @Name + ',Corporate from 
(
    SELECT 
     *, 
     CASE ISCorporate WHEN 1 THEN TotalCost ELSE 0 END AS NewTotalCost 
    FROM #tblRS 
) x 
pivot 
(
    SUM(TotalCost) 
    FOR Name in (' + @Name + ') 
) p ' 

PRINT(@query) 
EXECUTE(@query) 

@Name:它会给你列表上你想申请SUM