【发布时间】:2019-02-19 14:32:25
【问题描述】:
我需要将数据分成多个组。每个分组是数据的总和。但是,对于每个分组,如果一个项目是多个组的成员,并且一个组被遗漏,则需要从它所属的任何其他组中删除该项目。
例如:
CREATE TABLE #test (Item VARCHAR(1), Group1 BIT, Group2 BIT, Units INT)
INSERT INTO #test (Item, Group1, Group2, Units)
VALUES
('A', 1, 0, 2),
('B', 1, 1, 2),
('C', 1, 1, 2),
('D', 1, 1, 2),
('E', 0, 1, 2)
如果我们假设 Group1 总共需要 7 个单位才能退回,而 Group2 需要退回总共 9 个单位。
到目前为止我有这个:
--Everything that is NOT NULL will be excluded
Select *
FROM #test t
LEFT OUTER JOIN (
SELECT t.Group1, SUM(t.Units) AS TotalUnits
FROM #test t
WHERE t.Group1 = 1
GROUP BY t.Group1
HAVING SUM(Units) < 7
) g1 ON g1.Group1 = t.Group1
LEFT OUTER JOIN (
SELECT t.Group2, SUM(t.Units) AS TotalUnits
FROM #test t
WHERE t.Group2 = 1
GROUP BY t.Group2
HAVING SUM(Units) < 9
) g2 ON g2.Group2 = t.Group2
如果你运行这个,你会看到:
B,C,D,E 未能通过 Group2 的测试,因为它们总计 8 个单元,并且 他们至少需要 9 岁。
A、B、C、D 接替 Group1,因为它们加起来是 8 个单位,并且它们 只需要有 7 个或更多。
但是,我需要对此进行更改,以使两者都失败。
由于 B、C、D 在 Group2 中失败,因此需要将它们排除在 Group1 之外。
所以实际上,Group1 只会是项目 A,有 2 个单位,这会失败,因为它少于 group1 所需的 7 个。
很难解释,但基本上我需要将相同的数据以多种方式分组,这样如果它在一个分组中失败,它就会被排除在第二个分组之外,反之亦然。
对于输出,我希望是这样的。请注意,Group1 的总单位为 2,因为 B、C、D 不再计入其总和。从技术上讲,我猜 Group2 的 TotalUnits 也应该是 2,因为当 group1 失败时,项目 B、C、D 不再计入它的总和。基本上试图同时评估两个相交的组,其中一个的总和取决于另一组的总和发生了什么。
Item Group1 Group2 Units Group1 TotalUnits Group2 TotalUnits
A 1 0 2 1 2 NULL NULL
B 1 1 2 1 2 1 8
C 1 1 2 1 2 1 8
D 1 1 2 1 2 1 8
E 0 1 2 NULL NULL 1 8
【问题讨论】:
-
嗨,是的,这很难解释,但如果你的查询中有这些,那么好的解释是例外的输出
-
您在发布正确的样本数据方面做得很好,但如果您可以edit 您的问题也发布此数据的预期输出,那将有助于我们更好地理解这个问题。
标签: sql sql-server tsql