单元格

时间:2016-12-14 14:43:29

标签: sql sql-server sql-server-2012

使用MS SQL 2012

我有桌子,我需要找到一定价格的差价,这个新栏目将是我导入CMS时的价格调整。

SQL Fiddle Schema

免责声明:不确定小提琴是否正常工作从未使用过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

2 个答案:

答案 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]