SQL以多种方式对相同数据进行分组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL以多种方式对相同数据进行分组相关的知识,希望对你有一定的参考价值。
我需要将数据分组到多个组中。每个分组是数据的总和。但是,对于每个分组,如果某个项目是多个组的成员,并且一个组被遗漏,则该项目需要从其所属的任何其他组中删除。
例如:
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只是2个单位的项目A,因为它小于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。
另请注意,您提供的qazxsw poi声明缺少第4列零...
这是你想要的?
CREATE TABLE
以上是关于SQL以多种方式对相同数据进行分组的主要内容,如果未能解决你的问题,请参考以下文章
在一列中对具有相同数据的行进行分组,并将其相关数据汇总在另一列中 [ORACLE SQL]