【问题标题】:Custom SQL GROUP BY Clause自定义 SQL GROUP BY 子句
【发布时间】:2012-01-26 18:29:11
【问题描述】:

我有一个非常自定义的 SQL 查询,但在实现时遇到了问题。我正在使用 SQL-Server-2008。

我在此查询中只有一个表,但我正在寻找非常具体的数据。此查询的要求是:

对于每个 DISTINCT PartNumber(列),我需要选择要选择的 NEWEST(最大)PO(列)。但是,还有一个名为“Receipt”的列,如果它包含一个值,那么 PartNumber 应该被一起排除。

我对用于选择的 GROUP BY 子句和 CASES 有点熟悉,但我不确定如何将我所知道的所有信息整合到一个有效的查询中...

非常感谢任何帮助!提前致谢 =)。

【问题讨论】:

    标签: sql sql-server-2008 group-by


    【解决方案1】:
    SELECT Partnumber, MAX(PO)
    FROM MyTable t1
    WHERE NOT EXISTS (SELECT 1
                      FROM MyTable
                      WHERE (Receipt <> '0'
                             OR Receipt <> '')
                      AND Partnumber = t1.partnumber)
    GROUP BY PartNumber
    

    此处的NOT EXISTS 将排除具有零件编号的任何行,该零件编号在表格中的任何位置都为其填充了收据。

    【讨论】:

    • 这似乎是最好的方法。为我工作!忽略此评论的先前编辑。谢谢!
    • @ImGreg - 我在其中添加了这一点。您也可以使用 NOT IN 但这与 NULL 存在问题,正如 Aaron 在 cmets 的其他答案中指出的那样。
    • 优秀。谢谢! PartNumber“不应该”为空,但最好谨慎行事。
    【解决方案2】:

    这是反加入选项

    SELECT t1.Partnumber, MAX(t1.PO)
    FROM MyTable t1
         LEFT JOIN
          (SELECT DISTINCT PartNumber From MyTable
           WHERE  COALESCE(Receipt, '') = '') t2
         ON t1.Partnumber = t2.Partnumber
    WHERE
         t2.Partnumber is null
    GROUP BY t1.PartNumber
    

    【讨论】:

    • 我不确定 PartNumber 的“WHERE”子句是否为空?但除此之外,这似乎是对的。
    • @ImGreg - 排除满足 JOIN 条件的记录。
    【解决方案3】:
    SELECT MAX(PO)
    FROM aTable
    WHERE PartNumber NOT IN (
       SELECT PartNumber
       FROM aTable
       WHERE Receipt IS NULL
       GROUP BY PartNumber
       HAVING PartNumber IS NOT NULL /* fix */
    )
    GROUP BY PartNumber
    

    【讨论】:

    • 建议反对NOT IN。虽然在这种情况下,可能暗示/假设 PartNumber 不可为空,但如果 PartNumber 可以为空,则此查询可能会返回不可预测的结果(这对于正在寻找解决他们自己的略有不同问题的解决方案的其他读者来说可能是正确的)。建议改用NOT EXISTSLEFT JOIN 构造。
    【解决方案4】:

    编辑:根据 cmets 中的说明,这简化为:

    如果我理解正确,应该这样做:

    SELECT MAX(PO)
    FROM Table
    GROUP BY PartNumber
    HAVING MAX(Receipt) = 0
    

    HAVING 子句将消除任何 PartNumber,其中对于带有 PartNumber 的任何行,甚至有一个非零 Receipt 条目。

    【讨论】:

    • 我只会添加 Receipt ' ' 就好像它可能已被填充的字段一样,但随后空白,NULL 可能不再适用并且应该被排除在外......我会还要在字段列表中包含 partNumber,以防他们需要在逻辑“组”中查找它们,而不是按一些随机的、不相关的 P/O 编号基础进行查找。
    • 我认为这与他想要的相反 - 他想排除具有已填充收据的Partnumbers。此外,MAX(Receipt) 永远不会为 NULL 因为 NULL 在默认情况下会被聚合忽略
    • 谢谢,我已经在纠正测试的感觉了。 NULL 确实会被聚合忽略,但如果没有非 NULL Receipt 字段,则 MAX(Receipt) 的结果实际上是 NULL 并且可以这样进行测试。
    • 而且还是跟他追求的相反
    • 很抱歉应该提到收据列如果为空,它将是“0”而不是空值。另外,这不是只检查收据列的最大值吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 2018-09-07
    • 1970-01-01
    • 2021-10-21
    • 2012-12-07
    相关资源
    最近更新 更多