如何使用sum函数的两个select语句

时间:2013-04-03 18:37:52

标签: mysql sql sql-server-2008 sqlite

我正在尝试加入这两个表,当我使用任何连接时出现错误。 Union将工作但返回两行中的所有值,而不是我需要的3。这是我到目前为止所得到的,它返回的是它。任何帮助都会很棒:)

select C.CustId ,SUM(Ia.Amount) as total
from Invoice I 
    inner join InvoiceAmtSummary Ia  on I.GUIDInvoice=Ia.GUIDInvoice
    inner join Customer C on  C.GUIDCustomer=I.GUIDCustomer
WHERE DATEPART(mm, I.InvoiceDate) = DATEPART(mm, DATEADD(mm, -1, getdate()))
and DATEPART(yyyy, I.InvoiceDate) = DATEPART(yyyy, DATEADD(yyyy, -0, getdate()))
group by C.CustId
union
select C.CustId ,SUM(Ia.Amount) as total2
from Invoice I 
    inner join InvoiceAmtSummary Ia  on I.GUIDInvoice=Ia.GUIDInvoice
    inner join Customer C on  C.GUIDCustomer=I.GUIDCustomer
WHERE DATEPART(mm, I.InvoiceDate) = DATEPART(mm, DATEADD(mm, -2, getdate()))
and DATEPART(yyyy, I.InvoiceDate) = DATEPART(yyyy, DATEADD(yyyy, -0, getdate()))
group by C.CustId

返回的结果如下所示<* p>以下的结果

Custid        total
a             2
b             9
b             12
c             16
d             3
d             12

Custid        total      total2
a             2         
b             9          12
c             16
d             3          12
 

3 个答案:

答案 0 :(得分:0)

select c.custid, c.total, c2.total2
from (select C.CustId ,SUM(Ia.Amount) as total
  from Invoice I 
      inner join InvoiceAmtSummary Ia  on I.GUIDInvoice=Ia.GUIDInvoice
      inner join Customer C on  C.GUIDCustomer=I.GUIDCustomer
  WHERE DATEPART(mm, I.InvoiceDate) = DATEPART(mm, DATEADD(mm, -1, getdate()))
  and DATEPART(yyyy, I.InvoiceDate) = DATEPART(yyyy, DATEADD(yyyy, -0, getdate()))
  group by C.CustId) c
 inner join
  (select C.CustId ,SUM(Ia.Amount) as total2
  from Invoice I 
      inner join InvoiceAmtSummary Ia  on I.GUIDInvoice=Ia.GUIDInvoice
      inner join Customer C on  C.GUIDCustomer=I.GUIDCustomer
  WHERE DATEPART(mm, I.InvoiceDate) = DATEPART(mm, DATEADD(mm, -2, getdate()))
  and DATEPART(yyyy, I.InvoiceDate) = DATEPART(yyyy, DATEADD(yyyy, -0, getdate()))
  group by C.CustId) c2 on c.custid = c2.custid

答案 1 :(得分:0)

我认为您正在尝试使用不同月份的2列SUM。您可以这样做:

Select C.CustId ,
Sum(Case DATEPART(mm, I.InvoiceDate) 
When  DATEPART(mm, DATEADD(mm, -1, getdate())) Then Ia.Amount 
Else 0 End) As 'Total1',
Sum(Case DATEPART(mm, I.InvoiceDate) 
When  DATEPART(mm, DATEADD(mm, -2, getdate())) Then Ia.Amount 
Else 0 End) As 'Total2'
from Invoice I 
    inner join InvoiceAmtSummary Ia  on I.GUIDInvoice=Ia.GUIDInvoice
    inner join Customer C on  C.GUIDCustomer=I.GUIDCustomer
WHERE 
 DATEPART(yyyy, I.InvoiceDate) = DATEPART(yyyy, DATEADD(yyyy, -0, getdate()))
group by C.CustId

我使用Case来避免递归连接。

答案 2 :(得分:0)

由于您使用的是MySQL,我会通过实现内联sqlvariables(通过我的第一个“from”别名来实现。@ FirstOfThisMonth是通过减去当前日期当前日期(少于1)来计算的。

Ex:今天是4月3日(月的第3天)。所以,-3 = 3月31日...... PLUS 1带回当月的4月1日。确定该日期后,我现在可以在上个月(3月1日)的第一个月减去整个月,并在2月1日减去2个月。

现在,这种复杂性已经完成,我们可以使用这些变量而不是每月和每年的常量日期部分提取。特别是如果你考虑从2月10日开始两个月前做。 (目前的第一个是2月1日,一个月回到1月1日,两个月回到上一年的12月1日)。

现在,我根据条件的情况简单地使用SUM()。

如果发票日期>&gt; = @TwoMonthsAgo且比@ LastMonth少,则会进入两个月前的总数。 接下来是发票日期&gt; = @LastMonth,而不是@FirstOfThisMonth上个月的总数。

现在,你有一个滚动的两个月窗口...如果你想要更长的时间,只需添加另一个月变量引用和SUM()其标准。

最后,WHERE子句只能包含大于或等于@TwoMonthsAgo的发票,因此它不必遍历整个数据库

select 
      C.CustId,
      SUM( CASE when I.InvoiceDate >= @TwoMonthsAgo AND I.InvoiceDate < @LastMonth
           then Ia.Amount else 0 end ) as TotalTwoMonthsAgo,
      SUM( CASE when I.InvoiceDate >= @LastMonth AND I.InvoiceDate < @FirstOfThisMonth
           then Ia.Amount else 0 end ) as TotalLastMonth
   from 
      ( select @FirstOfThisMonth := date_add( now(), INTERVAL -dayofmonth(now())+1 day ),
               @LastMonth := date_add( @myDate, INTERVAL -1 month ),
               @TwoMonthsAgo := date_add( @myDate, INTERVAL -2 month )) sqlvars,
      Invoice I 
         inner join InvoiceAmtSummary Ia  
            on I.GUIDInvoice = Ia.GUIDInvoice
         inner join Customer C 
            on  C.GUIDCustomer = I.GUIDCustomer
   WHERE 
          I.InvoiceDate >= @TwoMonthsAgo
      AND I.InvoiceDate < @FirstOfThisMonth
   group by 
      C.CustID