我有一个非常自定义的SQL查询,我在实现时遇到了问题。我正在使用SQL-Server-2008。
我在此查询中只有一个表,但我正在寻找非常具体的数据。此查询的要求是:
对于每个DISTINCT PartNumber(列),我需要选择要选择的最新(最大)PO(列)。但是,还有另一个名为“Receipt”的列,如果它包含一个值,那么PartNumber应该被排除在一起。
我对GROUP BY条款和CASES的选择有点熟悉,但我不确定如何将我所知道的所有内容整合到一个有效的查询中......
非常感谢任何帮助!提前谢谢=)。
答案 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
条目。