使用MS SQL 2012 ,
我有桌子,我需要找到一定价格的差价,这个新栏目将是我导入CMS时的价格调整。
免责声明:不确定小提琴是否正常工作从未使用过sql fiddle,坚持架构并且有一些数据存在。
伪: 每个价格都不像' xCarcass'在列st_style上,然后基于相同的pd_ref计算它与xCarcass之间的差异
解释 所以基本上每个PD_Code都有几个价格,具体取决于st_style的含义。在我的cms我要导入这些价格,xCarcass用作我的基本价格,我希望所有其他st_styles显示价格差异而不是全价。 (基差价格差异,即xCarcass价格)。
到目前为止: 我知道我需要为此创建一个cte查询,但对于CTE来说我是真正的新手。
WITH cte as
(SELECT
ROW_NUMBER() OVER (PARTITION BY [Pricing].[pd_code] ORDER BY [pd_ref]) row,
[pd_code]
,[pd_ref]
,[pg_groupref]
,[pr_price]
,[pg_group]
,[st_styleref]
,[st_style]
FROM [Pricing])
SELECT a.[pd_code]
,a.[pd_ref]
,a.[pg_groupref]
,a.[pg_group]
,a.[st_styleref]
,a.[st_style],
a.pr_price - ISNULL(b.pr_price,0)
FROM
cte a
LEFT JOIN cte b
on a.[pd_code] = b.[pd_code]
and a.row = b.row+1
你可以看到这根本不起作用,因为我没有指定条件,我认为它完全错误,但我很确定我需要在这个问题中使用CTE查询。
任何人都可以通过正确的方式对所描述的问题执行此查询吗?如果您需要进一步说明,请询问。
预期的OutPUT
**pd_code | pd_ref | pg_groupref | pg_group | st_styleref | st_style | Price | (no col name)**
DG 100 | 72166 | 1336 | xCarcass | 3484 | xCarcass | 500 | 0
DG 100 | 72166 | 1337 | grp 1 | 3480 | stlye 3 | 550 | 50
DG 100 | 72166 | 1338 | grp 2 | 3488 | style 7 | 700 | 200
注意(请注意如何将此信息编辑为漂亮的表格)
进一步澄清
为了帮助clairify,每个pd_code有大约111行不同的样式,其中1个被称为' xCarcass',所有样式都有rpice,我需要一个新的列,最终基本上调整差异它的价格与xCarcass'特定行的价格之间的价格相同。对于每个pd_code
答案 0 :(得分:1)
您可以使用max
窗口函数获取每个pd_code的xcarcass行的价格,并将其用于该pd_code的所有其他非xcarcass行的减法。
select p.*
,pr_price - coalesce(max(case when st_style like '%xcarcass%' then pr_price end) over(partition by pd_code) ,0) val_diff
from pricing p
答案 1 :(得分:0)
如果您使用的是sql-server-2012,那么可以使用分析函数来实现LEAD()
。以下是您可以使用
SELECT
[pd_code]
,[pd_ref]
,[pg_groupref]
,[pr_price] - ISNULL(LEAD(pr_price) OVER(ORDER BY pd_ref), 0)
,[pg_group]
,[st_styleref]
,[st_style]
FROM [Pricing]