2016-09-21 128 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