在 sql 中使用 PIVOT
Using PIVOT in sql
我关注TypeStatusDetails
table。这个 table 有不同的 TypeID
。每种类型最多可以有 4 StatusID
s(或更少,例如 TypeID
3 只有 3 StatusID
s)。
RecordCount 显示没有。特定 StatusID 的记录数。
(例如 Type_1 的 3 条待处理记录)
---------------------------------------------------------------
TypeID Type StatusID StatusName RecordCount
---------------------------------------------------------------
1 Type_1 1 Pending 3
1 Type_1 2 In Process 2
1 Type_1 3 Completed 1
1 Type_1 4 Invalid 1
2 Type_2 1 Pending 4
2 Type_2 2 In Process 5
2 Type_2 3 Completed 6
2 Type_2 4 Invalid 1
3 Type_3 1 Pending 1
3 Type_3 2 In Process 1
3 Type_3 3 Completed 1
我想要的结果如下 table:
根据每种类型,我想根据带有 StatusID 的状态显示 RecordCount。
--------------------------------------------------------------------------------
Type Type Status Pending Status InProcess Status Completed Status Invalid ID ID Count ID Count ID Count ID Count
for for for for
Pending InProcess Completed Invalid
--------------------------------------------------------------------------------
1 Type_1 1 3 2 2 3 1 4 1
2 Type_2 1 4 2 5 3 6 4 1
3 Type_3 1 1 2 1 3 1 4 0
我使用了以下查询
SELECT *
FROM (
SELECT
TypeID,Type,StatusName,RecordCount
FROM #TypeStatusDetails
) as s
PIVOT
(
SUM(RecordCount)
FOR StatusName IN ([Pending],[In Process],[Completed],[Invalid])
)AS pvt
但是我无法根据每个 StatusName 获取 StatusId 列以将其组合到数据透视表中。
谁能帮我解决这个问题?
您可以使用 条件聚合 而不是 PIVOT
:
SELECT TypeID, Type,
MAX(CASE WHEN StatusName = 'Pending' THEN StatusID END) AS [Status for Pending],
SUM(CASE WHEN StatusName = 'Pending' THEN RecordCount ELSE 0 END) AS [Pending],
MAX(CASE WHEN StatusName = 'In Process' THEN StatusID END) AS [Status for In Process],
SUM(CASE WHEN StatusName = 'In Process' THEN RecordCount ELSE 0 END) AS [In Process],
MAX(CASE WHEN StatusName = 'Completed' THEN StatusID END) AS [Status for Completed],
SUM(CASE WHEN StatusName = 'Completed' THEN RecordCount ELSE 0 END) AS [Completed],
MAX(CASE WHEN StatusName = 'Invalid' THEN StatusID END) AS [Status for Invalid],
SUM(CASE WHEN StatusName = 'Invalid' THEN RecordCount ELSE 0 END) AS [Invalid]
FROM TypeStatusDetails
GROUP BY TypeID, Type
以上查询是标准 ANSI SQL,可用于任何 RDMBS。
SELECT 类型 ID,类型,
Coalesce(MAX(CASE WHEN StatusName = 'Pending' THEN StatusID END),0) AS [Status for Pending],
SUM(CASE WHEN StatusName = 'Pending' THEN RecordCount ELSE 0 END) AS [Pending],
Coalesce(MAX(CASE WHEN StatusName = 'In Process' THEN StatusID END),0) AS [Status for In Process],
SUM(CASE WHEN StatusName = 'In Process' THEN RecordCount ELSE 0 END) AS [In Process],
Coalesce(MAX(CASE WHEN StatusName = 'Completed' THEN StatusID END),0) AS [Status for Completed],
SUM(CASE WHEN StatusName = 'Completed' THEN RecordCount ELSE 0 END) AS [Completed],
Coalesce(MAX(CASE WHEN StatusName = 'Invalid' THEN StatusID END),0) AS [无效状态],
SUM(CASE WHEN StatusName = 'Invalid' THEN RecordCount ELSE 0 END) AS [无效]
来自 TypeStatusDetails
按类型 ID 分组,类型
我关注TypeStatusDetails
table。这个 table 有不同的 TypeID
。每种类型最多可以有 4 StatusID
s(或更少,例如 TypeID
3 只有 3 StatusID
s)。
RecordCount 显示没有。特定 StatusID 的记录数。 (例如 Type_1 的 3 条待处理记录)
---------------------------------------------------------------
TypeID Type StatusID StatusName RecordCount
---------------------------------------------------------------
1 Type_1 1 Pending 3
1 Type_1 2 In Process 2
1 Type_1 3 Completed 1
1 Type_1 4 Invalid 1
2 Type_2 1 Pending 4
2 Type_2 2 In Process 5
2 Type_2 3 Completed 6
2 Type_2 4 Invalid 1
3 Type_3 1 Pending 1
3 Type_3 2 In Process 1
3 Type_3 3 Completed 1
我想要的结果如下 table:
根据每种类型,我想根据带有 StatusID 的状态显示 RecordCount。
--------------------------------------------------------------------------------
Type Type Status Pending Status InProcess Status Completed Status Invalid ID ID Count ID Count ID Count ID Count
for for for for
Pending InProcess Completed Invalid
--------------------------------------------------------------------------------
1 Type_1 1 3 2 2 3 1 4 1
2 Type_2 1 4 2 5 3 6 4 1
3 Type_3 1 1 2 1 3 1 4 0
我使用了以下查询
SELECT *
FROM (
SELECT
TypeID,Type,StatusName,RecordCount
FROM #TypeStatusDetails
) as s
PIVOT
(
SUM(RecordCount)
FOR StatusName IN ([Pending],[In Process],[Completed],[Invalid])
)AS pvt
但是我无法根据每个 StatusName 获取 StatusId 列以将其组合到数据透视表中。
谁能帮我解决这个问题?
您可以使用 条件聚合 而不是 PIVOT
:
SELECT TypeID, Type,
MAX(CASE WHEN StatusName = 'Pending' THEN StatusID END) AS [Status for Pending],
SUM(CASE WHEN StatusName = 'Pending' THEN RecordCount ELSE 0 END) AS [Pending],
MAX(CASE WHEN StatusName = 'In Process' THEN StatusID END) AS [Status for In Process],
SUM(CASE WHEN StatusName = 'In Process' THEN RecordCount ELSE 0 END) AS [In Process],
MAX(CASE WHEN StatusName = 'Completed' THEN StatusID END) AS [Status for Completed],
SUM(CASE WHEN StatusName = 'Completed' THEN RecordCount ELSE 0 END) AS [Completed],
MAX(CASE WHEN StatusName = 'Invalid' THEN StatusID END) AS [Status for Invalid],
SUM(CASE WHEN StatusName = 'Invalid' THEN RecordCount ELSE 0 END) AS [Invalid]
FROM TypeStatusDetails
GROUP BY TypeID, Type
以上查询是标准 ANSI SQL,可用于任何 RDMBS。
SELECT 类型 ID,类型,
Coalesce(MAX(CASE WHEN StatusName = 'Pending' THEN StatusID END),0) AS [Status for Pending],
SUM(CASE WHEN StatusName = 'Pending' THEN RecordCount ELSE 0 END) AS [Pending],
Coalesce(MAX(CASE WHEN StatusName = 'In Process' THEN StatusID END),0) AS [Status for In Process],
SUM(CASE WHEN StatusName = 'In Process' THEN RecordCount ELSE 0 END) AS [In Process],
Coalesce(MAX(CASE WHEN StatusName = 'Completed' THEN StatusID END),0) AS [Status for Completed],
SUM(CASE WHEN StatusName = 'Completed' THEN RecordCount ELSE 0 END) AS [Completed],
Coalesce(MAX(CASE WHEN StatusName = 'Invalid' THEN StatusID END),0) AS [无效状态],
SUM(CASE WHEN StatusName = 'Invalid' THEN RecordCount ELSE 0 END) AS [无效]
来自 TypeStatusDetails
按类型 ID 分组,类型