2010-04-23 48 views
1

我有表供應商部件列出了我所有的零件及其供應商。具有多個供應商的零件在此表中有多個記錄。我試圖編寫一個只返回partid的查詢,以及沒有分配默認供應商的零件的供應商。SQL分組查詢問題;根據一個字段的值對一組行進行評估

Partid  Vendor  Defaultflag 
1   A   1 
2   B   0 
2   C   0 
3   D   0 
3   E   0 
3   F   1 
4   G   0 

我想返回如下:

Partid  Vendor 
2   B 
2   C 
4   G 

我顯然具有PARTID 3個問題,並獲取查詢看到它具有指定默認的供應商。

+1

我不明白你希望你的查詢返回的東西。 2A沒有一排,所以你爲什麼要返回? – brydgesk 2010-04-23 20:34:01

+0

對不起:我的意思是返回2B,2C和4G – user324575 2010-04-23 20:35:41

+0

@OMG,3被3F覆蓋? – 2010-04-23 20:52:25

回答

1

使用內部選擇查找沒有默認供應商的部件。這是partid分組時MAX(Defaultflag) = 0的部分。然後您可以將其加入到原始表中以獲取所有行。下面是完整的查詢:

SELECT T2.Partid, T2.Vendor 
FROM (
    SELECT Partid 
    FROM Table1 
    GROUP BY Partid 
    HAVING MAX(Defaultflag) = 0 
) T1 
JOIN Table1 T2 
ON T1.PartId = T2.PartId 

結果:

2, 'B' 
2, 'C' 
4, 'G' 
+0

這也很好。 – user324575 2010-04-23 21:12:22

4

和空 - 左 - 加入方法:

SELECT vp0.Partid, vp0.Vendor 
FROM VendorParts AS vp0 
LEFT JOIN VendorParts AS vp1 ON vp1.Partid=vp0.Partid AND vp1.Defaultflag=1 
WHERE vp1.Partid IS NULL 
+1

對於某些SQL服務器,這種方法比使用子查詢要快得多。 – eswald 2010-04-23 20:55:36

2

你可以嘗試像

DECLARE @VendorParts TABLE(
     Partid INT, 
     Vendor VARCHAR(10), 
     Defaultflag INT 
) 
INSERT INTO @VendorParts SELECT 1,'A',1 
INSERT INTO @VendorParts SELECT 2,'B',0 
INSERT INTO @VendorParts SELECT 2,'C',0 
INSERT INTO @VendorParts SELECT 3,'D',0 
INSERT INTO @VendorParts SELECT 3,'E',0 
INSERT INTO @VendorParts SELECT 3,'F',1 
INSERT INTO @VendorParts SELECT 4,'G',0 

SELECT * 
FROM @VendorParts vp 
WHERE NOT EXISTS (
         SELECT 1 
         FROM @VendorParts 
         WHERE Partid = vp.Partid 
         AND  Defaultflag = 1 
        ) 

輸出

Partid  Vendor  Defaultflag 
----------- ---------- ----------- 
2   B   0 
2   C   0 
4   G   0 
+0

我需要它是動態的,因爲我的庫存中有幾千個零件。 – user324575 2010-04-23 20:56:37

+0

你能解釋一下嗎?你的評論沒有意義? – 2010-04-23 21:00:19

+0

我需要查詢來評估包含8,030條記錄的預先存在的表。它看起來像你的方法是將預定義的值插入到一個新的表中查詢。 – user324575 2010-04-23 21:09:42

0

select 
partid, 
vendor 
from 
vendorparts 
where 
partid not in (
    select 
    partid 
    from 
    vendorparts 
    where 
    defaultflag = 1 
); 
+0

我認爲這有我最接近的正確道路。 – user324575 2010-04-23 21:11:29

相關問題