C# 在这种情况下,如何使用透视表进行计算?
如何从给定的数据中获得以下结果 报告C# 在这种情况下,如何使用透视表进行计算?,c#,sql,sql-server,sql-server-2008,C#,Sql,Sql Server,Sql Server 2008,如何从给定的数据中获得以下结果 报告 ------------------------------------------------- ID | Name | Status ------------------------------------------------- 1 | A | Inprogress 2 | A | Inprogress 3 |
-------------------------------------------------
ID | Name | Status
-------------------------------------------------
1 | A | Inprogress
2 | A | Inprogress
3 | A | Complete
我需要像这样计算结果
---------------------------------------------
Name | Total | Complete | Remaining
---------------------------------------------
A | 3 | 1 | 2
SQL:
您不需要使用
PIVOT
操作符。尝试使用子查询
或交叉应用
运算符来解决您的任务
;WITH test_data AS(
SELECT 1 AS id, 'A' AS NAME, 'Inprogress' AS [status]
UNION ALL
SELECT 2, 'A', 'Inprogress'
UNION ALL
SELECT 3, 'A', 'Complete'
UNION ALL
SELECT 4, 'B', 'Complete'
)
SELECT DISTINCT
name,
T3.*
FROM test_data AS T
CROSS APPLY (SELECT COUNT(*) AS total,
SUM(CASE WHEN T2.status = 'Complete' THEN 1 ELSE 0 END) AS complete,
SUM(CASE WHEN T2.status = 'Inprogress' THEN 1 ELSE 0 END) AS remaining
FROM test_data AS T2
WHERE T2.name = T.name) AS T3
您不需要使用
PIVOT
操作符。尝试使用子查询
或交叉应用
运算符来解决您的任务
;WITH test_data AS(
SELECT 1 AS id, 'A' AS NAME, 'Inprogress' AS [status]
UNION ALL
SELECT 2, 'A', 'Inprogress'
UNION ALL
SELECT 3, 'A', 'Complete'
UNION ALL
SELECT 4, 'B', 'Complete'
)
SELECT DISTINCT
name,
T3.*
FROM test_data AS T
CROSS APPLY (SELECT COUNT(*) AS total,
SUM(CASE WHEN T2.status = 'Complete' THEN 1 ELSE 0 END) AS complete,
SUM(CASE WHEN T2.status = 'Inprogress' THEN 1 ELSE 0 END) AS remaining
FROM test_data AS T2
WHERE T2.name = T.name) AS T3
你可以采取几种方法。本例使用。如果您不熟悉这个概念,CASE允许您有条件地返回所选的值。我已将示例数据转换为表变量: 样本数据
/* Creating sample data inside a table variable makes it
* easy to share.
*/
DECLARE @Sample TABLE
(
ID INT,
Name VARCHAR(50),
[Status] VARCHAR(50)
)
;
/* Sample values taken from OP.
*/
INSERT INTO @Sample
(
ID,
Name,
[Status]
)
VALUES
(1, 'A', 'Inprogress'),
(2, 'A', 'Inprogress'),
(3, 'A', 'Complete')
;
案例返回1表示所需状态,0表示所有其他状态。对结果求和可得到小计
/* Using CASE to return conditional sub totals.
*/
SELECT
Name,
COUNT([Status]) AS Total,
SUM(CASE WHEN [Status] = 'Complete' THEN 1 ELSE 0 END) AS Complete,
SUM(CASE WHEN [Status] = 'Inprogress' THEN 1 ELSE 0 END) AS Remaining
FROM
@Sample
GROUP BY
Name
;
你可以采取几种方法。本例使用。如果您不熟悉这个概念,CASE允许您有条件地返回所选的值。我已将示例数据转换为表变量: 样本数据
/* Creating sample data inside a table variable makes it
* easy to share.
*/
DECLARE @Sample TABLE
(
ID INT,
Name VARCHAR(50),
[Status] VARCHAR(50)
)
;
/* Sample values taken from OP.
*/
INSERT INTO @Sample
(
ID,
Name,
[Status]
)
VALUES
(1, 'A', 'Inprogress'),
(2, 'A', 'Inprogress'),
(3, 'A', 'Complete')
;
案例返回1表示所需状态,0表示所有其他状态。对结果求和可得到小计
/* Using CASE to return conditional sub totals.
*/
SELECT
Name,
COUNT([Status]) AS Total,
SUM(CASE WHEN [Status] = 'Complete' THEN 1 ELSE 0 END) AS Complete,
SUM(CASE WHEN [Status] = 'Inprogress' THEN 1 ELSE 0 END) AS Remaining
FROM
@Sample
GROUP BY
Name
;