【问题标题】:SQL Server: PivotSQL Server:枢轴
【发布时间】:2016-09-21 04:03:37
【问题描述】:

请帮我解决这个问题。我有这样的数据:

 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 = 0Total 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

【问题讨论】:

  • 我看不出这是一个真正的动态枢轴,但是在 PIVOT IMO 上使用条件聚合会更容易。例如SELECT SUM(CASE WHEN Name = 'Wash, Dry & Fold' AND isCorporate = 1 THEN TC END), SUM(CASE WHEN Name = 'Pressing Only'... 等以及额外的 SUM(CASE WHEN isCorporate = 0 THEN TC END)

标签: sql-server stored-procedures pivot-table


【解决方案1】:

使用动态列集合选择 PIVOT 数据,因为它会为您提供在表中添加的任何新列值,假设 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 的列列表

【讨论】:

    猜你喜欢
    • 2010-12-01
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多