Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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
Sql server 使用汇总集和分组集格式化结果_Sql Server_Sql Server 2008_Sql Server 2008 R2 - Fatal编程技术网

Sql server 使用汇总集和分组集格式化结果

Sql server 使用汇总集和分组集格式化结果,sql-server,sql-server-2008,sql-server-2008-r2,Sql Server,Sql Server 2008,Sql Server 2008 R2,我正在尝试学习SQL Server 2008 R2中的汇总和分组集运算符。我的桌子看起来像这样: +-------+---------+------------+------+-------+----------+------+ | EmpID | EmpName | StartDate | Type | Units | Account | Dist | +-------+---------+------------+------+-------+----------+------+ | 1

我正在尝试学习SQL Server 2008 R2中的
汇总
分组集
运算符。我的桌子看起来像这样:

+-------+---------+------------+------+-------+----------+------+ | EmpID | EmpName | StartDate | Type | Units | Account | Dist | +-------+---------+------------+------+-------+----------+------+ | 11111 | Alice | 2015-09-04 | SD20 | 0.500 | 560.2200 | 100 | | 11111 | Alice | 2015-09-08 | CCS | 1.330 | 9P0.6010 | 38 | | 11111 | Alice | 2015-09-08 | CCS | 2.170 | 010.9055 | 62 | | 11111 | Alice | 2015-09-10 | SD20 | 0.500 | LP0.3002 | 100 | | 11111 | Alice | 2015-09-14 | SD20 | 0.500 | LP0.3002 | 100 | | 11111 | Alice | 2015-09-17 | SD20 | 1.000 | LP0.P303 | 100 | | 11111 | Alice | 2015-09-18 | SD20 | 1.000 | 600.2200 | 100 | | 11111 | Alice | 2015-09-24 | SD20 | 1.000 | LP0.3002 | 100 | | 11111 | Alice | 2015-09-25 | SD20 | 1.000 | LP0.3002 | 100 | | 11111 | Alice | 2015-09-29 | SD20 | 1.000 | LP0.3002 | 100 | | 33333 | Carol | 2015-09-03 | SD20 | 1.000 | 9P0.PP10 | 100 | | 33333 | Carol | 2015-09-04 | SD20 | 0.200 | 600.6P62 | 20 | | 33333 | Carol | 2015-09-04 | SD20 | 0.800 | 600.6P62 | 80 | | 33333 | Carol | 2015-09-25 | SD20 | 1.000 | P50.2100 | 100 | +-------+---------+------------+------+-------+----------+------+
我是否可以使用
汇总
和/或
分组集
运算符来获得我想要的内容,而不是所有的
大小写
表达式?

我相信使用带有多维数据集的分组运算符将使您接近最终目标。使用这种方法,您可以选择过滤行或更改空值的显示方式

select 
    EmpID, 
    EmpName, 
    [Type], 
    Units, 
    Account
from 
    (   
        select 
            EmpID, 
            EmpName, 
            [Type], 
            sum(Units) AS Units, 
            Account
        from mytable
        group by EmpID, EmpName, [Type], Account with CUBE
    ) s
where s.yourfilter

链接:

我相信使用多维数据集操作符的GROUP BY将使您接近最终目标。使用这种方法,您可以选择过滤行或更改空值的显示方式

select 
    EmpID, 
    EmpName, 
    [Type], 
    Units, 
    Account
from 
    (   
        select 
            EmpID, 
            EmpName, 
            [Type], 
            sum(Units) AS Units, 
            Account
        from mytable
        group by EmpID, EmpName, [Type], Account with CUBE
    ) s
where s.yourfilter

链接:

我认为您对汇总的期望太高了-这是我的建议示例,我无法完全摆脱CASE-s,但结果看起来像您的目标:

DECLARE @Data TABLE (
    EmpID INT,
    EmpName VARCHAR(100),
    StartDate DATE,
    [Type] VARCHAR(10),
    Units DECIMAL(10, 3),
    Account VARCHAR(100),
    Dist INT
);

INSERT INTO
    @Data
VALUES
    (11111, 'Alice', '2015-09-04', 'SD20', 0.500, '560.2200', 100),
    (11111, 'Alice', '2015-09-08', 'CCS',  1.330, '9P0.6010',  38),
    (11111, 'Alice', '2015-09-08', 'CCS',  2.170, '010.9055',  62),
    (11111, 'Alice', '2015-09-10', 'SD20', 0.500, 'LP0.3002', 100),
    (11111, 'Alice', '2015-09-14', 'SD20', 0.500, 'LP0.3002', 100),
    (11111, 'Alice', '2015-09-17', 'SD20', 1.000, 'LP0.P303', 100),
    (11111, 'Alice', '2015-09-18', 'SD20', 1.000, '600.2200', 100),
    (11111, 'Alice', '2015-09-24', 'SD20', 1.000, 'LP0.3002', 100),
    (11111, 'Alice', '2015-09-25', 'SD20', 1.000, 'LP0.3002', 100),
    (11111, 'Alice', '2015-09-29', 'SD20', 1.000, 'LP0.3002', 100),
    (33333, 'Carol', '2015-09-03', 'SD20', 1.000, '9P0.PP10', 100),
    (33333, 'Carol', '2015-09-04', 'SD20', 0.200, '600.6P62',  20),
    (33333, 'Carol', '2015-09-04', 'SD20', 0.800, '600.6P62',  80),
    (33333, 'Carol', '2015-09-25', 'SD20', 1.000, 'P50.2100', 100)


SELECT
    CASE
        WHEN RN = 0 THEN OrigEmpID
        ELSE NULL 
        END AS EmpID,
    CASE
        WHEN RN = 0 THEN EmpName
        ELSE NULL 
        END AS EmpName,
    CASE
        WHEN RN = 0 THEN NULL
        WHEN RN = 3 THEN 'Subtotal' 
        ELSE [OrigType] 
        END AS [Type],
    Units,
    Account
FROM (
    SELECT DISTINCT
        0 AS RN,
        EmpID AS OrigEmpID, 
        EmpName,
        cast(NULL AS VARCHAR(10)) AS [OrigType],
        cast(NULL AS DECIMAL(10,3)) AS Units,
        cast(NULL AS VARCHAR(100)) AS Account
    FROM
        @Data

    UNION ALL

    SELECT
        CASE WHEN Account IS NULL THEN 3 ELSE 2 END RN,
        EmpID AS OrigEmpID, 
        EmpName, 
        [Type] AS [OrigType],
        sum(Units) AS Units, 
        Account
    FROM
        @Data
    GROUP BY 
        EmpID, EmpName, [Type], ROLLUP(Account)
) data
ORDER BY
    OrigEmpID, [OrigType], RN, Account

我想,您对汇总的期望太高了-这是我的建议示例,我无法完全摆脱CASE-s,但结果看起来像您的目标:

DECLARE @Data TABLE (
    EmpID INT,
    EmpName VARCHAR(100),
    StartDate DATE,
    [Type] VARCHAR(10),
    Units DECIMAL(10, 3),
    Account VARCHAR(100),
    Dist INT
);

INSERT INTO
    @Data
VALUES
    (11111, 'Alice', '2015-09-04', 'SD20', 0.500, '560.2200', 100),
    (11111, 'Alice', '2015-09-08', 'CCS',  1.330, '9P0.6010',  38),
    (11111, 'Alice', '2015-09-08', 'CCS',  2.170, '010.9055',  62),
    (11111, 'Alice', '2015-09-10', 'SD20', 0.500, 'LP0.3002', 100),
    (11111, 'Alice', '2015-09-14', 'SD20', 0.500, 'LP0.3002', 100),
    (11111, 'Alice', '2015-09-17', 'SD20', 1.000, 'LP0.P303', 100),
    (11111, 'Alice', '2015-09-18', 'SD20', 1.000, '600.2200', 100),
    (11111, 'Alice', '2015-09-24', 'SD20', 1.000, 'LP0.3002', 100),
    (11111, 'Alice', '2015-09-25', 'SD20', 1.000, 'LP0.3002', 100),
    (11111, 'Alice', '2015-09-29', 'SD20', 1.000, 'LP0.3002', 100),
    (33333, 'Carol', '2015-09-03', 'SD20', 1.000, '9P0.PP10', 100),
    (33333, 'Carol', '2015-09-04', 'SD20', 0.200, '600.6P62',  20),
    (33333, 'Carol', '2015-09-04', 'SD20', 0.800, '600.6P62',  80),
    (33333, 'Carol', '2015-09-25', 'SD20', 1.000, 'P50.2100', 100)


SELECT
    CASE
        WHEN RN = 0 THEN OrigEmpID
        ELSE NULL 
        END AS EmpID,
    CASE
        WHEN RN = 0 THEN EmpName
        ELSE NULL 
        END AS EmpName,
    CASE
        WHEN RN = 0 THEN NULL
        WHEN RN = 3 THEN 'Subtotal' 
        ELSE [OrigType] 
        END AS [Type],
    Units,
    Account
FROM (
    SELECT DISTINCT
        0 AS RN,
        EmpID AS OrigEmpID, 
        EmpName,
        cast(NULL AS VARCHAR(10)) AS [OrigType],
        cast(NULL AS DECIMAL(10,3)) AS Units,
        cast(NULL AS VARCHAR(100)) AS Account
    FROM
        @Data

    UNION ALL

    SELECT
        CASE WHEN Account IS NULL THEN 3 ELSE 2 END RN,
        EmpID AS OrigEmpID, 
        EmpName, 
        [Type] AS [OrigType],
        sum(Units) AS Units, 
        Account
    FROM
        @Data
    GROUP BY 
        EmpID, EmpName, [Type], ROLLUP(Account)
) data
ORDER BY
    OrigEmpID, [OrigType], RN, Account
检查:检查: