你可以这样做:
SELECT *
FROM
(
SELECT
OrderID,
OrderStatus + CountType AS StatusType,
DayCount
FROM CalendarTable
UNION ALL
SELECT
OrderID,
CASE WHEN CountType = 'Working' THEN 'TotalWorking' ELSE 'TotalCalendar' END,
DayCount
FROM CalendarTable
) AS t
PIVOT
(
MAX(DayCount)
For StatusType IN(OpenWorking,
OpenCalendar,
CloseWorking,
CloseCalendar,
PendingWorking,
PendingCalendar,
TotalWorking,
TotalCalendar)
) AS p;
这会给你:
如果你不想手动写下所有的状态,那么你可以动态地做:
将@cols 声明为 NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
SELECT @cols = STUFF((SELECT distinct ',' +
QUOTENAME(StatusType)
FROM
(
SELECT
OrderID,
OrderStatus + CountType AS StatusType,
DayCount
FROM CalendarTable
UNION ALL
SELECT
OrderID,
CASE WHEN CountType = 'Working' THEN 'TotalWorking' ELSE 'TotalCalendar' END,
DayCount
FROM CalendarTable
) AS t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '');
SELECT @query = 'SELECT *
FROM
(
SELECT
OrderID,
OrderStatus + CountType AS StatusType,
DayCount
FROM CalendarTable
UNION ALL
SELECT
OrderID,
CASE WHEN CountType = ''Working'' THEN ''TotalWorking'' ELSE ''TotalCalendar'' END,
DayCount
FROM CalendarTable
) AS t
PIVOT
(
MAX(DayCount)
For StatusType IN(' + @cols + ')' +
') p';
execute(@query);
更新:
对于列名,您可以创建一个新变量@colnames 并用您想要的名称填充它。对于总计,您可以添加 WHERE 子句以仅获取活动和待定状态的总计。所以你的查询会是这样的:
DECLARE @cols AS NVARCHAR(MAX);
DECLARE @colnames AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
SELECT @cols = STUFF((SELECT distinct ',' +
QUOTENAME(StatusType)
FROM
(
SELECT
OrderID,
OrderStatus + CountType AS StatusType,
DayCount
FROM CalendarTable
UNION ALL
SELECT
OrderID,
CASE WHEN CountType = 'Working' THEN 'TotalWorking' ELSE 'TotalCalendar' END,
DayCount
FROM CalendarTable
WHERE OrderStatus IN('Active', 'Pending')
) AS t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '');
SELECT @colnames = STUFF((SELECT distinct ',' +
QUOTENAME(StatusType) + ' AS ' + QUOTENAME(StatusTypeName)
FROM
(
SELECT
OrderID,
OrderStatus + CountType AS StatusType,
DayCount,
OrderStatus + CASE WHEN CountType = 'Working' THEN 'WorkDays' ELSE 'CalDays' END AS StatusTypeName
FROM CalendarTable
UNION ALL
SELECT
OrderID,
CASE WHEN CountType = 'Working' THEN 'TotalWorking' ELSE 'TotalCalendar' END,
DayCount,
CASE WHEN CountType = 'Working' THEN 'TotalWorking' ELSE 'TotalCalendar' END
FROM CalendarTable
WHERE OrderStatus IN('Active', 'Pending')
) AS t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '');
SELECT @query = 'SELECT OrderID , ' + @colnames + '
FROM
(
SELECT
OrderID,
OrderStatus + CountType AS StatusType,
DayCount
FROM CalendarTable
UNION ALL
SELECT
OrderID,
CASE WHEN CountType = ''Working'' THEN ''TotalWorking'' ELSE ''TotalCalendar'' END,
DayCount
FROM CalendarTable
WHERE OrderStatus IN(''Active'', ''Pending'')
) AS t
PIVOT
(
SUM(DayCount)
For StatusType IN(' + @cols + ')' +
') p';
execute(@query);
这会给你:
更新
如果您想在手动透视查询中添加 where 子句,您可以这样做:
SELECT *
FROM
(
SELECT
OrderID,
OrderStatus + CountType AS StatusType,
DayCount
FROM CalendarTable
WHERE ...
UNION ALL
SELECT
OrderID,
CASE WHEN CountType = 'Working' THEN 'TotalWorking' ELSE 'TotalCalendar' END,
DayCount
FROM CalendarTable
WHERE ...
) AS t
PIVOT
(
MAX(DayCount)
For StatusType IN(OpenWorking,
OpenCalendar,
CloseWorking,
CloseCalendar,
PendingWorking,
PendingCalendar,
TotalWorking,
TotalCalendar)
) AS p;