简体   繁体   English

一个基于两个值的表的SQL SUM

[英]SQL SUM of one tables based on two values

If possible some help with the following question. 如果可能的话,以下问题会有所帮助。 I need to make a margin analyses. 我需要进行余量分析。 This I can do with one table and in the table both Cost as Turnover are mentioned. 我可以用一个表来做,在表中同时提到了“营业额”。 Via the ordernumber I would like to connect the cost and turnover of one ordernumber. 我想通过订单号连接一个订单号的成本和营业额。

Via this query I get the Turnover(omzet) 通过此查询,我得到了营业额(omzet)

select  GBK.bkstnr_sub as Ordernummer,
        SUM(GBK.bdr_hfl*-1) as Omzet
from [040].dbo.gbkmut as GBK with (nolock)
where  (GBK.dagbknr = 50 or GBK.dagbknr = 40)and (GBK.reknr BETWEEN '     8000' AND '     8980') 
and GBK.bkstnr_sub in (Select ORK.ordernr from [040].dbo.orkrg as ORK with (nolock)  

where ORK.ord_soort = 'V' and ORK.status = 'A' and YEAR(ork.orddat)= '2014')

GROUP BY GBK.bkstnr_sub

Via this query I get the cost(kostprijs) 通过此查询,我得到了成本(kostprijs)

select  GBK.bkstnr_sub as Ordernummer,
        SUM(GBK.bdr_hfl*-1) as Omzet

from [040].dbo.gbkmut as GBK with (nolock)

where  (GBK.dagbknr = 50 or GBK.dagbknr = 40)and (GBK.reknr BETWEEN '     7000' AND '     8980') 
and GBK.bkstnr_sub in (Select ORK.ordernr from [040].dbo.orkrg as ORK with (nolock)  

where ORK.ord_soort = 'V' and ORK.status = 'A' and YEAR(ork.orddat)= '2014')

GROUP BY GBK.bkstnr_sub

My wished result are the following columns; 我希望得到的结果是以下几列; Ordernumber, Turnover, cost 订单号,营业额,成本

Please give direction. 请指示。 At the moment I am lost. 此刻我迷路了。

No need to use a join here, this should give you what you want: 无需在此处使用联接,这应该可以为您提供所需的信息:

select  bkstnr_sub as Ordernummer,
        SUM(case when reknr BETWEEN '     8000' AND '     8980'  then GBK.bdr_hfl * -1 end) as Omzet,
        SUM(case when reknr BETWEEN '     7000' AND '     8980'  then GBK.bdr_hfl * -1 end) as kostprijs
from    [040].dbo.gbkmut
where   (dagbknr = 50 or dagbknr = 40) and 
        bkstnr_sub in (
            Select ordernr 
            from [040].dbo.orkrg
            where ord_soort = 'V' and 
                  status = 'A' and 
                  YEAR(orddat)= '2014')
GROUP BY bkstnr_sub

There may be a way to combine the results and avoid the sub queries. 可能有一种方法可以合并结果并避免子查询。 I've not given it the needed thought. 我没有给出需要的想法。 This is the simplest approach that is easy to understand; 这是最简单易懂的方法。 without rewriting both queries. 而不重写两个查询。

SELECT Turnover.OrderNummer, 
   TurnOver.omzet as TurnoverOmzet, 
   Cost.Omzet as CostOmzet
FROM 
    (SELECT GBK.bkstnr_sub as Ordernummer,
            SUM(GBK.bdr_hfl*-1) as Omzet
     FROM [040].dbo.gbkmut as GBK with (nolock)
     WHERE (GBK.dagbknr = 50 or GBK.dagbknr = 40)
       and (GBK.reknr BETWEEN '     8000' AND '     8980') 
       and GBK.bkstnr_sub in 
          (SELECT ORK.ordernr 
           FROM  [040].dbo.orkrg as ORK with (nolock)  
           WHERE ORK.ord_soort = 'V' 
             and ORK.status = 'A' 
             and YEAR(ork.orddat)= '2014')
     GROUP BY GBK.bkstnr_sub) as turnover
INNER JOIN 
    (SELECT GBK.bkstnr_sub as Ordernummer,
            SUM(GBK.bdr_hfl*-1) as Omzet
     FROM [040].dbo.gbkmut as GBK with (nolock)
     WHERE (GBK.dagbknr = 50 or GBK.dagbknr = 40)
       and (GBK.reknr BETWEEN '     7000' AND '     8980') 
       and GBK.bkstnr_sub in 
       (SELECT ORK.ordernr 
        FROM  [040].dbo.orkrg as ORK with (nolock)  
        WHERE ORK.ord_soort = 'V' 
          and ORK.status = 'A' 
          and YEAR(ork.orddat)= '2014')
     GROUP BY GBK.bkstnr_sub) as Cost
ON Turnover.orderNummer = Cost.orderNummer

Thank you for helping. 感谢您的帮助。 Suddenly I had a other thougt and used the code below. 突然之间,我又有了另一个想法,并使用了下面的代码。

select  GBK.bkstnr_sub as Ordernummer,
        SUM(GBK.bdr_hfl*-1) as Omzet,
        SUM(GBKK.bdr_hfl) as Kostprijs

from [040].dbo.gbkmut as GBK with (nolock)

 JOIN 

             (select    GBKK.bkstnr_sub,    
                    GBKK.bdr_hfl

            from [040].dbo.gbkmut as GBKK with (nolock)
            where  (GBKK.dagbknr = 50 or GBKK.dagbknr = 40)and GBKK.reknr BETWEEN '     7000' AND '     7980'
            and GBKK.bkstnr_sub in (Select ORK.ordernr from [040].dbo.orkrg as ORK with (nolock)  

            where ORK.ord_soort = 'V' and ORK.status = 'A' and YEAR(ork.orddat)= '2014')) as GBKK
on GBK.bkstnr_sub = GBKK.bkstnr_sub

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM