自定义SQL GROUP BY子句

时间:2012-01-26 18:29:12

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

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

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

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

我对GROUP BY条款和CASES的选择有点熟悉,但我不确定如何将我所知道的所有内容整合到一个有效的查询中......

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

4 个答案:

答案 0 :(得分:4)

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此处将排除任何具有在表格中任何位置填充收据的部件号的行。

答案 1 :(得分:2)

这是Anti-Join选项

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

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

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