Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL选择添加数字之间存在差异的新行_Sql_Sql Server - Fatal编程技术网

SQL选择添加数字之间存在差异的新行

SQL选择添加数字之间存在差异的新行,sql,sql-server,Sql,Sql Server,我有一个查询,给出了年份之间的总和,但我想在每个TARMA的末尾添加一行,给出年份之间的差异 以下是查询: Select VPC.Armazem as TARMA ,YEAR(VPC.DATA) as DataTotal ,SUM(CASE WHEN VP.COMBUSTIVEL = 1 THEN VPL.QTD ELSE 0 END) as ADITIVADA ,SUM(CASE WHEN VP.COMBUSTIVEL = 2 THEN VPL.QTD

我有一个查询,给出了年份之间的总和,但我想在每个TARMA的末尾添加一行,给出年份之间的差异

以下是查询:

 Select  
     VPC.Armazem as TARMA
    ,YEAR(VPC.DATA) as DataTotal
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 1 THEN VPL.QTD ELSE 0 END) as ADITIVADA
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 2 THEN VPL.QTD ELSE 0 END) as X98
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 3 THEN VPL.QTD ELSE 0 END)as X95
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 4 THEN VPL.QTD ELSE 0 END) as XGAS
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 5 THEN VPL.QTD ELSE 0 END) as XGPL
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 6 THEN VPL.QTD ELSE 0 END) as XAGR
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 7 THEN VPL.QTD ELSE 0 END) as MISTURA
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 9 THEN VPL.QTD ELSE 0 END) as XAQ
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 10 THEN VPL.QTD ELSE 0 END) as ADIESEL
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 11 THEN VPL.QTD ELSE 0 END) as ADBLUE
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 12 THEN VPL.QTD ELSE 0 END) as O95
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 13 THEN VPL.QTD ELSE 0 END) as O98

WHERE 
    (MONTH(VPC.DATA) >= MONTH('2015-09-01') AND MONTH(VPC.DATA) <= MONTH('2015-09-30'))
    and (YEAR(VPC.DATA) >= YEAR('2014-09-01') AND YEAR(VPC.DATA) <= YEAR('2015-09-30'))
    and VPT.armazem IN ('454','457')
    and FACT_VD NOT IN ('A', 'I', 'G', 'M')
GROUP BY
    YEAR(VPC.DATA)
    ,VPC.Armazem
ORDER BY
    VPC.Armazem
    ,YEAR(VPC.DATA)
以下是没有差异的结果: [结果][1]

例如:

TARMA:454用于X98

2014年:1849.14077

2015年:2571.47750

差额:-72233673

我正在使用MS SQL。 是和工会在一起吗


如何获得差异?

将查询作为子查询使用,而不使用order by,可以执行以下操作:

with cte as (
      <your query here>
     )
select cte.*,
       (additava - lag(additava) over (partition by Armazem order by DataTotal) ) as additava_diff,
       . . .
from cte;

如果要在单独的查询中计算差异,然后只将行添加到结果中,则可以在所有查询之间使用UNION ALL。UNION ALL将只合并两个结果集。使用just UNION将导致SQL Server尝试消除两个结果集中的重复行。

我得到了:

;with dados as (

    Select  
     VPC.Armazem as TARMA
    ,YEAR(VPC.DATA) as DataTotal1
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 1 THEN VPL.QTD ELSE 0 END) as SomaADITIVADA
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 2 THEN VPL.QTD ELSE 0 END) as SomaX98
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 3 THEN VPL.QTD ELSE 0 END)as SomaX95
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 4 THEN VPL.QTD ELSE 0 END) as SomaXGAS
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 5 THEN VPL.QTD ELSE 0 END) as SomaXGPL
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 6 THEN VPL.QTD ELSE 0 END) as SomaXAGR
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 7 THEN VPL.QTD ELSE 0 END) as SomaMISTURA
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 9 THEN VPL.QTD ELSE 0 END) as SomaXAQ
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 10 THEN VPL.QTD ELSE 0 END) as SomaADIESEL
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 11 THEN VPL.QTD ELSE 0 END) as SomaADBLUE
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 12 THEN VPL.QTD ELSE 0 END) as SomaO95
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 13 THEN VPL.QTD ELSE 0 END) as SomaO98
    ,row_number() over (partition by VPC.Armazem order by YEAR(VPC.DATA) ASC) as NAno

WHERE 
    (MONTH(VPC.DATA) >= MONTH('2015-09-01') AND MONTH(VPC.DATA) <= MONTH('2015-09-30'))
    and (YEAR(VPC.DATA) >= YEAR('2014-09-01') AND YEAR(VPC.DATA) <= YEAR('2015-09-30'))
    and VPT.armazem IN ('454','457')
    and FACT_VD NOT IN ('A', 'I', 'G', 'M')
GROUP BY
    YEAR(VPC.DATA)
    ,VPC.Armazem

)

SELECT
      anosDetalhados.TARMA as TARMA
     ,anosDetalhados.DataTotal1 as DataTotal
     ,SUM(anosDetalhados.SomaADITIVADA) as ADITIVADA 
     ,SUM(anosDetalhados.SomaX98) as X98
     ,SUM(anosDetalhados.SomaX95) as X95
     ,SUM(anosDetalhados.SomaXGAS) as XGAS
     ,SUM(anosDetalhados.SomaXGPL) as XGPL
     ,SUM(anosDetalhados.SomaXAGR) as XAGR
     ,SUM(anosDetalhados.SomaMISTURA) as MISTURA
     ,SUM(anosDetalhados.SomaXAQ) as XAQ
     ,SUM(anosDetalhados.SomaADIESEL) as ADIESEL
     ,SUM(anosDetalhados.SomaADBLUE) as ADBLUE
     ,SUM(anosDetalhados.SomaO95) as O95
     ,SUM(anosDetalhados.SomaO98) as O98
FROM dados as anosDetalhados (nolock)
GROUP BY
    anosDetalhados.DataTotal1
    ,anosDetalhados.TARMA

UNION ALL

SELECT
     ano1.TARMA as TARMA
    ,NULL  as DataTotal
    ,SUM(coalesce(ano1.SomaADITIVADA-ano2.SomaADITIVADA, 0)) as ADITIVADA 
    ,SUM(coalesce(ano1.SomaX98-ano2.SomaX98, 0)) as X98
    ,SUM(coalesce(ano1.SomaX95-ano2.SomaX95, 0)) as X95
    ,SUM(coalesce(ano1.SomaXGAS-ano2.SomaXGAS, 0)) as XGAS
    ,SUM(coalesce(ano1.SomaXGPL-ano2.SomaXGPL, 0)) as XGPL
    ,SUM(coalesce(ano1.SomaXAGR-ano2.SomaXAGR, 0)) as XAGR
    ,SUM(coalesce(ano1.SomaMISTURA-ano2.SomaMISTURA, 0)) as MISTURA
    ,SUM(coalesce(ano1.SomaXAQ-ano2.SomaXAQ, 0)) as XAQ
    ,SUM(coalesce(ano1.SomaADIESEL-ano2.SomaADIESEL, 0)) as ADIESEL
    ,SUM(coalesce(ano1.SomaADBLUE-ano2.SomaADBLUE, 0)) as ADBLUE
    ,SUM(coalesce(ano1.SomaO95-ano2.SomaO95, 0)) as O95
    ,SUM(coalesce(ano1.SomaO98-ano2.SomaO98, 0)) as O98
FROM dados as ano1 (nolock)
LEFT JOIN dados as ano2 on ano1.TARMA=ano2.TARMA and ano1.NAno > ano2.NAno
GROUP BY
    ano1.TARMA
ORDER BY
    TARMA
   ,anosDetalhados.DataTotal1 ASC

在你的例子中,你有3年的时间。。你说的差异是什么意思是的,我不明白你说的差异是什么意思。我建议您编辑您的帖子并添加所需的结果。抱歉,现在获得了正确的图像和差异示例不幸的是,我正在使用的服务器运行的是旧版本,但我不知道如何计算差异,这就是我遇到的问题:s
;with dados as (

    Select  
     VPC.Armazem as TARMA
    ,YEAR(VPC.DATA) as DataTotal1
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 1 THEN VPL.QTD ELSE 0 END) as SomaADITIVADA
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 2 THEN VPL.QTD ELSE 0 END) as SomaX98
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 3 THEN VPL.QTD ELSE 0 END)as SomaX95
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 4 THEN VPL.QTD ELSE 0 END) as SomaXGAS
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 5 THEN VPL.QTD ELSE 0 END) as SomaXGPL
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 6 THEN VPL.QTD ELSE 0 END) as SomaXAGR
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 7 THEN VPL.QTD ELSE 0 END) as SomaMISTURA
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 9 THEN VPL.QTD ELSE 0 END) as SomaXAQ
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 10 THEN VPL.QTD ELSE 0 END) as SomaADIESEL
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 11 THEN VPL.QTD ELSE 0 END) as SomaADBLUE
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 12 THEN VPL.QTD ELSE 0 END) as SomaO95
    ,SUM(CASE WHEN VP.COMBUSTIVEL = 13 THEN VPL.QTD ELSE 0 END) as SomaO98
    ,row_number() over (partition by VPC.Armazem order by YEAR(VPC.DATA) ASC) as NAno

WHERE 
    (MONTH(VPC.DATA) >= MONTH('2015-09-01') AND MONTH(VPC.DATA) <= MONTH('2015-09-30'))
    and (YEAR(VPC.DATA) >= YEAR('2014-09-01') AND YEAR(VPC.DATA) <= YEAR('2015-09-30'))
    and VPT.armazem IN ('454','457')
    and FACT_VD NOT IN ('A', 'I', 'G', 'M')
GROUP BY
    YEAR(VPC.DATA)
    ,VPC.Armazem

)

SELECT
      anosDetalhados.TARMA as TARMA
     ,anosDetalhados.DataTotal1 as DataTotal
     ,SUM(anosDetalhados.SomaADITIVADA) as ADITIVADA 
     ,SUM(anosDetalhados.SomaX98) as X98
     ,SUM(anosDetalhados.SomaX95) as X95
     ,SUM(anosDetalhados.SomaXGAS) as XGAS
     ,SUM(anosDetalhados.SomaXGPL) as XGPL
     ,SUM(anosDetalhados.SomaXAGR) as XAGR
     ,SUM(anosDetalhados.SomaMISTURA) as MISTURA
     ,SUM(anosDetalhados.SomaXAQ) as XAQ
     ,SUM(anosDetalhados.SomaADIESEL) as ADIESEL
     ,SUM(anosDetalhados.SomaADBLUE) as ADBLUE
     ,SUM(anosDetalhados.SomaO95) as O95
     ,SUM(anosDetalhados.SomaO98) as O98
FROM dados as anosDetalhados (nolock)
GROUP BY
    anosDetalhados.DataTotal1
    ,anosDetalhados.TARMA

UNION ALL

SELECT
     ano1.TARMA as TARMA
    ,NULL  as DataTotal
    ,SUM(coalesce(ano1.SomaADITIVADA-ano2.SomaADITIVADA, 0)) as ADITIVADA 
    ,SUM(coalesce(ano1.SomaX98-ano2.SomaX98, 0)) as X98
    ,SUM(coalesce(ano1.SomaX95-ano2.SomaX95, 0)) as X95
    ,SUM(coalesce(ano1.SomaXGAS-ano2.SomaXGAS, 0)) as XGAS
    ,SUM(coalesce(ano1.SomaXGPL-ano2.SomaXGPL, 0)) as XGPL
    ,SUM(coalesce(ano1.SomaXAGR-ano2.SomaXAGR, 0)) as XAGR
    ,SUM(coalesce(ano1.SomaMISTURA-ano2.SomaMISTURA, 0)) as MISTURA
    ,SUM(coalesce(ano1.SomaXAQ-ano2.SomaXAQ, 0)) as XAQ
    ,SUM(coalesce(ano1.SomaADIESEL-ano2.SomaADIESEL, 0)) as ADIESEL
    ,SUM(coalesce(ano1.SomaADBLUE-ano2.SomaADBLUE, 0)) as ADBLUE
    ,SUM(coalesce(ano1.SomaO95-ano2.SomaO95, 0)) as O95
    ,SUM(coalesce(ano1.SomaO98-ano2.SomaO98, 0)) as O98
FROM dados as ano1 (nolock)
LEFT JOIN dados as ano2 on ano1.TARMA=ano2.TARMA and ano1.NAno > ano2.NAno
GROUP BY
    ano1.TARMA
ORDER BY
    TARMA
   ,anosDetalhados.DataTotal1 ASC