2015-02-10 46 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) 

在这一点上,你已经得到了所有的型号,款式,价格,你需要的表,所以你只要求和价格。