2017-10-12 66 views
1

我想要拿出一個查詢,返回一個部分的列表,該部分的所有標誌都是假的,並且返回的列表應該只有一個記錄返回那部分。如果所有都是假的返回1記錄ID

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 

第一部分和第三部分至少有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 

有誰知道如何解決這一問題?

+2

什麼[tag:rdbms]你在用嗎? – Mureinik

+0

您可能需要使用子查詢或自引用連接來檢查相同部件ID的正數行。或者取決於你的RDBMS可能有更好的方法 – ADyson

+0

@Mureinik Sql Server Management Studio – bubbajake00

回答

1

首先,選擇所有的有標誌的記錄=真

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 
+0

這很簡單,我現在正在工作!過去幾天我一直在關注這個問題,所以謝謝你解決我的挫折! – bubbajake00

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 
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 
0

如何這樣的事情,作爲一個更普遍的提法,因爲case語句可以做得相當複雜:

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 
相關問題