Con MS SQL 2012 ,

Tengo una tabla, necesito encontrar la diferencia con un precio determinado, esta nueva columna será el ajuste de precio cuando importe a un CMS.

Esquema de violín SQL

DESCARGO DE RESPONSABILIDAD: no estoy seguro de si el violín está funcionando, nunca usé el violín sql antes, pero el esquema y algunos datos están allí.

Pseudo: Cada precio que NO sea como 'xCarcass' en la columna st_style, luego calcule la diferencia entre este y xCarcass basándose en el mismo pd_ref

Explicación Entonces, básicamente, cada PD_Code tiene varios precios dependiendo de qué st_style haya. En mis cms quiero importar estos precios, xCarcass se utiliza como mi precio base y quiero que todos los demás estilos st_styles muestren la diferencia de precio en lugar del precio total. (diferencia absedida sobre su precio base, es decir, precio xCarcass).

Hasta ahora: Sabía que necesitaría crear una consulta cte para esto, pero soy un verdadero novato con los 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

Como puede ver, esto no funciona en absoluto, ya que no he especificado una condición, creo que está completamente mal, pero estoy bastante seguro de que necesito usar una consulta CTE en este problema.

¿Alguien puede encontrar la forma correcta de realizar esta consulta al problema descrito? Si necesita alguna aclaración adicional, por favor pregunte.

Resultado esperado

**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 

NOTA (tenga en cuenta cómo editar esta información como una buena tabla)

Más aclaraciones

Para ayudar a clarificar, cada pd_code tiene aproximadamente 111 filas de estilos diferentes, 1 de las cuales se llama 'xCarcass', todos los estilos tienen un rpice, necesito una nueva columna al final que básicamente calcule la diferencia entre su precio y el del específico fila de 'xCarcass' para cada pd_code

2
lemunk 14 dic. 2016 a las 17:43

2 respuestas

La mejor respuesta

Puede usar la función de ventana max para obtener el precio de la fila xcarcass para cada pd_code y usarlo para restar en todas las demás filas que no sean xcarcass para ese pd_code.

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
Vamsi Prabhala 14 dic. 2016 a las 15:01

Si está usando sql-server-2012, entonces hay una función analítica disponible para lograr esto que es LEAD(). A continuación se muestra la consulta que puede utilizar

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]
0
Viki888 14 dic. 2016 a las 14:52