2014-11-03 18 views
1

我已返回樣低於3列的查詢:分組的行和組合數據

Second ref Code Description 
10/14/0094 ZW01008 Side Support Bracket PM1662TAA 
10/14/0095 ZW01008 Rear Hook LH PM1664TAA 
10/14/0095 ZW01008 Rear Hook LH PM1664TAA 
10/14/0095 ZW01008 Rear Hook RH PM1663TAA 
10/14/0095 ZW01008 Rear Hook RH PM1663TAA 
10/14/0096 ZW01008 Sunblind Brackets PM1665TAA 
10/14/0098 ZW01008 NEW TOOL TRIAL 300 HALFS 600 WEDGES 
10/14/0100 ZW01008 NEW TOOL TRIAL WATER RESERVOIR 

如果存在具有相同SecondRef多個行欲組的那些行一起,並且或者僅具有Description之一值顯示,因爲它們將是彼此的變體,或者將所有4個記錄的值合併到一個記錄中。

這裏是我用來獲取例如查詢:

SELECT AllocationBalance.SecondRef, StockItem.Code, BomRecord.Description 
FROM AllocationBalance AS AllocationBalance 
INNER JOIN StockItem AS StockItem ON AllocationBalance.ItemID = StockItem.ItemID 
INNER JOIN BomAllocation ON AllocationBalance.Reference = BomAllocation.AllocationNumber 
INNER JOIN WopOrder ON BomAllocation.BomAllocationID = WopOrder.BomAllocationID 
INNER JOIN BomRecord ON WopOrder.BomRecordID = BomRecord.BomRecordID 
WHERE  (AllocationBalance.RecipientName = 'BOM') AND (StockItem.Code LIKE '%ZW01008%') 

回答

3

只需使用GROUP BYMAXMIN

SELECT AllocationBalance.SecondRef, 
     StockItem.Code, 
     MAX(dbo.BomRecord.Description) as Description 
FROM [YOUR_TABLES] -- including joins 
WHERE (AllocationBalance.RecipientName = 'BOM') AND (StockItem.Code LIKE '%ZW01008%') 
GROUP BY AllocationBalance.SecondRef, StockItem.Code 

所以第一兩列編組,並採取最後的/最高值說明列。

使用MAX而不是MIN將覆蓋您的情況下,您可能有一個空的描述@Gordon在評論中提到。

+0

作品非常感謝你 – Oisian2 2014-11-03 14:04:00

+0

@坦納。 。 。我傾向於使用'max()'而不是'min()'。這樣,如果其中一個描述是空字符串,您將選擇其他內容。 – 2014-11-03 14:18:40

+0

@GordonLinoff謝謝,這是一個很好的觀點,已經修改了答案以包含這一點。 – Tanner 2014-11-03 14:24:27

0

嘗試DISTINCT。 如果我理解正確 - 那就是你需要的。

+0

最好不要 - 首先這不適用於一些不重要的列,它們具有不同的值,其次你完全不能控制查詢結果。 SQL有這些東西的'group by'操作符。 'distinct'關鍵字對於快速臨時查詢來檢查SSMS中的某些內容非常有用,因此可以將它用於'count(distinct something)'等表達式中,但不能作爲'group by'的窮人替換項。 – Arvo 2014-11-03 13:57:56