這是關係部門:link 1,link 2。
如果除數表(只食品和飲料)是靜態的,那麼你可以使用這些解決方案之一:
DECLARE @OrderDetail TABLE
([OrderID] int, [Name] varchar(8), [Type] varchar(8), [Price] decimal(10,2))
;
INSERT INTO @OrderDetail
([OrderID], [Name], [Type], [Price])
SELECT 1, 'Broccoli', 'Food', 1.0
UNION ALL SELECT 1, 'Beer', 'Beverage', 5.0
UNION ALL SELECT 1, 'Coke', 'Beverage', 2.0
UNION ALL SELECT 2, 'Beef', 'Food', 2.5
UNION ALL SELECT 2, 'Juice', 'Beverage', 1.5
UNION ALL SELECT 3, 'Beer', 'Beverage', 5.0
UNION ALL SELECT 4, 'Tomato', 'Food', 1.0
UNION ALL SELECT 4, 'Apple', 'Food', 1.0
UNION ALL SELECT 4, 'Broccoli', 'Food', 1.0
-- Solution 1
SELECT od.OrderID,
COUNT(DISTINCT od.Type) AS DistinctTypeCount,
MAX(CASE WHEN od.Type='beverage' THEn od.Price END) AS MaxBeveragePrice
FROM @OrderDetail od
WHERE od.Type IN ('food', 'beverage')
GROUP BY od.OrderID
HAVING COUNT(DISTINCT od.Type) = 2 -- 'food' & 'beverage'
-- Solution 2: better performance
SELECT pvt.OrderID,
pvt.food AS MaxFoodPrice,
pvt.beverage AS MaxBeveragePrice
FROM (
SELECT od.OrderID, od.Type, od.Price
FROM @OrderDetail od
WHERE od.Type IN ('food', 'beverage')
) src
PIVOT (MAX(src.Price) FOR src.Type IN ([food], [beverage])) pvt
WHERE pvt.food IS NOT NULL
AND pvt.beverage IS NOT NULL
結果(方案1 & 2):
OrderID DistinctTypeCount MaxBeveragePrice
----------- ----------------- ---------------------------------------
1 2 5.00
2 2 1.50
Table 'Worktable'. Scan count 2, logical reads 23, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#09DE7BCC'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
OrderID MaxFoodPrice MaxBeveragePrice
----------- --------------------------------------- ---------------------------------------
1 1.00 5.00
2 2.50 1.50
Table '#09DE7BCC'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
。 。因爲你說這個觀點很貴,我認爲你應該選擇波格丹的解決方案。我以前從未做過這樣的評論,但是您確實強調視圖的緩慢性,並且該解決方案是唯一一次只能掃描一次視圖的解決方案。 –
是的,這是一個好的或者更好的答案。在我經歷波格丹之前,我已經選擇並實施了這個。然而,我的最終標準是要解決這個問題,所以我選擇了第一個也是最好的答案。但我理解你的意見。 – Rupal