2016-09-21 4 views
1

Пожалуйста, помогите мне с этим. У меня есть данные, как это:SQL Server: Pivot

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 (CASE WHEN Name = 'Wash, Dry & Fold' AND isoror = 1 THEN TC END), SUM (CASE WHEN Name = 'Нажатие только' ...' и т. Д. С дополнительным '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