使用MS 2012,
我有表,我需要找出不同的价格,这个新的专栏将是价格调整时,我导入到一个CMS。
SQL Fiddle模式
免责声明:不确定fiddle是否正常工作,以前从未使用过sql,确定模式并提供一些数据。
伪:每个不像列st_style上的' xCarcass‘的价格,然后根据相同的pd_ref计算出它和xCarcass之间的差异。
解释,所以基本上每个PD_Code都有几个价格,这取决于st_style有什么。在我的cms中,我想要导入这些价格,xCarcass被用作我的基本价格,我希望所有其他st_styles都显示价格差异,而不是全价。(与基准价格之差,即xCarcass价格)。
到目前为止,:我知道我需要为此创建一个查询,但是我对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 备注(请注意如何将此信息编辑为一个漂亮的表)
进一步澄清
为了帮助分类,每个pd_code有大约111行不同的样式,其中1行被称为“xCarcass”,所有样式都有一个rpice,我需要一个新的列在末尾,基本上计算出它的价格与每个pd_code的特定行'xCarcass‘之间的差额。
发布于 2016-12-14 14:54:25
您可以使用max窗口函数来获取每个pd_code的x屠体行的价格,并将其用于减去该pd_code的所有其他非x屠体行。
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发布于 2016-12-14 14:52:50
如果您使用的是SQLserver-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]https://stackoverflow.com/questions/41145358
复制相似问题