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以多种方式对相同数据进行分组的主要内容,如果未能解决你的问题,请参考以下文章

SQL:查询以显示每个属性有多少用户(分组)

在一列中对具有相同数据的行进行分组,并将其相关数据汇总在另一列中 [ORACLE SQL]

仅在某些条件下使用 Redshift 中的 SQL 对具有相同名称的行进行分组

如何对按顺序排列的相同值进行分组

Oracle sql查询按日期对连续记录进行分组

SQL系列—— 分组(group by)