我正在尝试提出一个查询,该查询返回一个部分列表,其中该部分的所有标志都为false,并且返回的列表应该只返回该部分的一条记录。
Part Revision Flag
Part1| A | true
Part1| B | false
Part2| C | false
Part2| D | false
Part2| E | false
Part3| A | true
Part4| F | false
输出:
Part Revision Flag
Part2| C(or any other revision) | false
Part4| F | false
Part1和Part3至少有1个标志设置为true,因此它们不会输出。第2部分和第4部分都没有设置为true的标志,Part2只返回所有部分的1行。
SELECT DISTINCT [PartNum],[RevisionNum],[Flag]
FROM [Prod].[Erp].[PartRev]
WHERE RevisionNum is not null AND Approved = 0
ORDER BY PartNum
GROUP BY [PartNum],[RevisionNum],[Flag]
到目前为止,我可以为每个零件编号获得一行,但即使该零件编号的其他零件之一为真,它也只返回一行。
返回的内容:
Part Revision Flag
Part1| B | false
Part2| C | false
Part4| F | false
有谁知道如何解决这个问题?
答案 0 :(得分:1)
首先,选择所有具有flag = true
的记录SELECT DISTINCT Part FROM PartRev WHERE flag = 1 --or whatever your RDBMS uses for a true value
然后,选择第一个查询中未包含的所有不同记录。所以,查询看起来像这样
SELECT Part, MIN(Revision), flag
FROM PartRev WHERE Part NOT IN (
SELECT DISTINCT Part FROM PartRev WHERE flag = 1
)
GROUP BY Part, flag
答案 1 :(得分:1)
另一个选择
Select Part
,Revision = max(Revision)
,Flag = max(flag)
from YourTable
Group By Part
Having max(Flag)='false'
返回
Part Revision Flag
Part2 E false
Part4 F false
答案 2 :(得分:0)
您可以使用WHERE NOT EXISTS
执行此操作,以便不提取任何带有true
标记的记录。
看起来您还希望在返回记录时提取该部件的最新版本,这可以通过ROW_NUMBER()
完成并选择最近的记录。
;With Cte As
(
Select *,
Row_Number() Over (Partition By Part Order By Revision Desc) As RN
From [Prod].[Erp].[PartRev] P1
Where RevisionNum is not null
And Approved = 0
And Not Exists
(
Select *
From [Prod].[Erp].[PartRev] P2
Where P1.Part = P2.Part
And P2.Flag = 'true'
)
)
Select Part, Revision, Flag
From Cte
Where RN = 1
答案 3 :(得分:0)
这样的事情怎么样,作为一个更通用的表述,因为案例陈述可以变得非常复杂:
SELECT
SP.Part
, SP.Revision
, SP.Flag
FROM (
SELECT
Part
, Count(Part) as TC
, SUM( CASE Flag WHEN 1 THEN 0 ELSE 1 END ) FC
, MAX(Revision) AS Revision
, MAX(flag) AS Flag
FROM test
GROUP BY Part
) SP
WHERE SP.TC=SP.FC