Sql server 使用汇总集和分组集格式化结果
我正在尝试学习SQL Server 2008 R2中的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
汇总
和分组集
运算符。我的桌子看起来像这样:
+-------+---------+------------+------+-------+----------+------+
| 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
检查:检查: