簡體   English   中英

如何基於查詢表使用SQL Server 2005 Pivot

[英]How to use SQL Server 2005 Pivot based on lookup table

表[狀態]具有以下數據:

ID  Status
1   PaymentPending
2   Pending
3   Paid
4   Cancelled
5   Error

====================================

數據表具有以下結構:

ID    WeekNumber StatusID
1       1           1
2       1           2
3       1           3
4       2           1
5       2           2
6       2           2
7       2           3

尋找樞軸

Week #      PaymentPending     Pending     Paid    Cancelled
Week 1            1                1         1         0
Week 2            1                2         1         0
SELECT 'Week '+CAST(coun.WeekNumber AS VARCHAR(10)) [Week #],[PaymentPending],[Pending],[Paid],[Cancelled],[Error] FROM 
(SELECT [WeekNumber],[Status] FROM dbo.WeekDetails 
INNER JOIN [dbo].[Status] AS s
ON [dbo].[WeekDetails].[StatusID] = [s].[ID]) AS wee
PIVOT (COUNT(wee.[Status]) FOR wee.[Status]
IN  ([PaymentPending],[Pending],[Paid],[Cancelled],[Error])) AS Coun

您可以將基於CASE的聚合與GROUP BY

SELECT 'Week ' + cast(WeekNumber as varchar(10)) as 'Week#',
       SUM ( CASE WHEN StatusId =1 THEN 1 else 0 end) as 'PaymentPending',
       SUM ( CASE WHEN StatusId =2 THEN 1 else 0 end) as 'Pending',
       SUM ( CASE WHEN StatusId =3 THEN 1 else 0 end) as 'Paid',
       SUM ( CASE WHEN StatusId =4 THEN 1 else 0 end) as 'Cancelled'
FROM DataTbl D
GROUP BY 'Week ' + cast(WeekNumber as varchar(10))

樞軸可能如下所示:

SELECT * FROM 
    (SELECT 
       'Week ' + CAST(D.WeekNumber AS varchar(2)) [Week #], 
       S.Status 
    FROM DataTbl D
    INNER JOIN Status S ON D.StatusID = S.ID
    ) Derived
PIVOT 
(
COUNT(Status) FOR Status IN 
  ([PaymentPending], [Pending], [Paid], [Cancelled]) -- add [Error] if needed
) Pvt

如果您希望Status表中的項目數發生變化,則可能需要考慮使用動態數據透視表來生成列標題。 像這樣:

DECLARE @sql AS NVARCHAR(MAX)
DECLARE @cols AS NVARCHAR(MAX)

SELECT @cols = ISNULL(@cols + ',','') + QUOTENAME(Status)
FROM (SELECT ID, Status FROM Status) AS Statuses ORDER BY ID

SET @sql =
  N'SELECT * FROM 
       (SELECT ''Week '' + CAST(D.WeekNumber AS varchar(2)) [Week #], S.Status
    FROM Datatbl D
    INNER JOIN Status S ON D.StatusID = S.ID) Q
    PIVOT (
       COUNT(Status)
          FOR Status IN (' + @cols + ')
        ) AS Pvt'

EXEC sp_executesql @sql;

示例SQL提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM