Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在这种情况下,如何使用透视表进行计算?_C#_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

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
;