2015-02-10 29 views
0

我有一個包含樣式代碼和模型代碼以及定價信息的表。SQL - 返回特殊行,然後通用,具體取決於搜索條件

MODEL CODE - STYLE CODE - PRICE 
10000  - STD  - 150.00 
10500  - FEL  - 25.50 
10500  - STD  - 19.90 
20050  - GEK  - 130.00 
20050  - FEL  - 99.99 
20050  - STD  - 50.00 
40330  - GEK  - 39.00 
40330  - STD  - 19.00 

您可以確定每個型號代碼都具有可用STD的樣式代碼。 我想要一個能夠查找某種風格的所有型號代碼的總價格的查詢,但如果該風格對於特定型號不存在,則需要標準價格。例如,如果我想從這張表中得到FEL價格,我會得到293.49。
(10000-STD @ 150 + 10500-FEL @ 25.50 + 20050-FEL @ 99.99 + 40330-STD @ 19.00)

+2

你有刺過它自己嗎?如果是這樣,你正在處理的查詢有什麼問題? – 2015-02-10 15:21:05

+2

您正在使用哪種RDBMS? – SoulTrain 2015-02-10 15:21:15

+0

我們正在使用Microsoft SQL Server。我是非常新的SQL,迄今爲止我所能獲得的最好結果是返回目標行和STD行上的價格總和。 – acmowad 2015-02-10 15:27:45

回答

1
-- first select the model codes. 
WITH models AS 
(
    SELECT DISTINCT MODEL_CODE 
    FROM TABLENAME 
), val_list AS 
(
    -- then left join back to the table and pick the style or default. 
    SELECT m.MODEL_CODE, COALESCE(x.PRICE,d.PRICE) AS PRICE 
    FROM models m 
    LEFT JOIN TABLENAME d ON d.MODEL_CODE = m.MODEL_CODE AND d.STYLE_CODE = 'STD' 
    LEFT JOIN TABLENAME x ON x.MODEL_CODE = m.MODEL_CODE AND x.STYLE_CODE = 'FEL' 
), 
SELECT SUM(PRICE) 
FROM val_list 

注意,如果你不能使用CTE下面會做同樣的事情:

SELECT SUM(PRICE) 
FROM (
    SELECT m.MODEL_CODE, COALESCE(x.PRICE,d.PRICE) AS PRICE 
    FROM (SELECT DISTINCT MODEL_CODE FROM TABLENAME) m 
    LEFT JOIN TABLENAME d ON d.MODEL_CODE = m.MODEL_CODE AND d.STYLE_CODE = 'STD' 
    LEFT JOIN TABLENAME x ON x.MODEL_CODE = m.MODEL_CODE AND x.STYLE_CODE = 'FEL' 
) val_list 

要看到這是如何工作的,你可以看看不同的部分 - 嘗試

-- first select the model codes. 
WITH models AS 
(
    SELECT DISTINCT MODEL_CODE 
    FROM TABLENAME 
) 
SELECT m.MODEL_CODE, x.PRICE, d.PRICE 
FROM models m 
LEFT JOIN TABLENAME d ON d.MODEL_CODE = m.MODEL_CODE AND d.STYLE_CODE = 'STD' 
LEFT JOIN TABLENAME x ON x.MODEL_CODE = m.MODEL_CODE AND x.STYLE_CODE = 'FEL' 

-- first select the model codes. 
WITH models AS 
(
    SELECT DISTINCT MODEL_CODE 
    FROM TABLENAME 
), val_list AS 
(
    -- then left join back to the table and pick the style or default. 
    SELECT m.MODEL_CODE, COALESCE(x.PRICE,d.PRICE) AS PRICE 
    FROM models m 
    LEFT JOIN TABLENAME d ON d.MODEL_CODE = m.MODEL_CODE AND d.STYLE_CODE = 'STD' 
    LEFT JOIN TABLENAME x ON x.MODEL_CODE = m.MODEL_CODE AND x.STYLE_CODE = 'FEL' 
) 
SELECT * 
FROM val_list 
0

這裏的另一種方式,通過模型CD做

with w_styles as (
     select model_cd, 
       style_cd, 
       price, 
       row_number() over (partition by model_cd order by case when style_cd = 'STD' then 'ZZZ' else style_cd end) r 
      from <yourtable> 
     where style_cd in ('FEL', 'STD') 
    ) 
    select model_cd, style_cd, price 
    from w_styles 
    where r = 1 

這只是收集了無論是「FEL」或默認的「性病」的記錄,那麼它們分組,更喜歡FEL代碼,如果在那裏,則通過STD。 然後丟棄它不需要的東西

0

這是一種方法。

declare @style as varchar(3) 
set @style = 'Fel' 

SELECT sum(price) as [Price] 
FROM 
(
SELECT 
t1.[model code], 
t1.[style code], 
t1.price 
FROM myTable t1 
WHERE ([style code] = @style) 

UNION 

SELECT 
t1.[model code], 
t1.[style code], 
t1.price 
FROM myTable t1 
WHERE ([style code] = 'Std') 
AND NOT EXISTS 
(SELECT null FROM myTable t2 WHERE t2.[model code]= t1.[model code] and t2.[style code] = @style) 
) A 

要一步通過它,本節得到的每個這裏的款式,你所選擇的風格相匹配的行:

SELECT 
t1.[model code], 
t1.[style code], 
t1.price 
FROM myTable t1 
WHERE ([style code] = @style) 

然後,我們將棧模型的其餘部分與一個那些結果聯盟。我們只想添加模型編號沒有查詢樣式代碼的行。我使用自連接和存在語句來完成它。

SELECT 
t1.[model code], 
t1.[style code], 
t1.price 
FROM myTable t1 
WHERE ([style code] = 'Std') -- standard codes 
AND NOT EXISTS    -- where there is not style of 'Fel' 
(SELECT null FROM myTable t2 WHERE t2.[model code]= t1.[model code] and t2. [style code] = @style) 

在這一點上,你已經得到了所有的型號,款式,價格,你需要的表,所以你只要求和價格。

相關問題