【问题标题】:SQL Grouping same data multiple waysSQL以多种方式对相同的数据进行分组
【发布时间】: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


【解决方案1】:

我认为您只需将其添加到查询的末尾:

where g1.Group1=1 and g2.Group2=1

请注意,您从子查询表中“绘制”了 group1/2 信息,当HAVING 过滤掉它们时返回 NULL。

另请注意,您提供的CREATE TABLE 语句缺少带有零的第 4 列...

【讨论】:

    【解决方案2】:

    这是你要找的吗?

    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);
    

    【讨论】:

    • 没有。 Group1 的大多数元素不应计入 Group1 的总和,因为它们在 Group2 之外失败。所以实际上,group1 的总和只会是“2”,因为只有项目 A 不是失败的 Group2 的一部分。
    • @fullstrum 。 . .您的问题陈述是:“如果我们假设 Group1 总共需要 7 个单位才能退回,而 Group2 需要退回总共 9 个单位。”
    猜你喜欢
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 2012-04-12
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多