[英]SQL Grouping same data multiple ways
我需要将数据分为多个组。 每个分组都是数据的总和。 但是,对于每个分组,如果某项是多个组的成员,而一个组被排除在外,则需要将该项目从其所属的任何其他组中删除。
例如:
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
我认为您所需要的只是将其添加到查询的末尾:
where g1.Group1=1 and g2.Group2=1
请注意,您从子查询表中“绘制”了group1 / 2信息,当HAVING
过滤掉时,该表将返回NULL。
还要注意,您提供的CREATE TABLE
语句缺少带有零的第4列...
这是你想要的?
select t.*
from (select t.*,
sum(group1 * units) over () as group1_units,
sum(group2 * units) over () as group2_units
from #test t
) t
where (group1 = 1 and group1_units >= 7) or
(group2 = 1 and group2_units >= 9);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.