2017-10-20 122 views
1

我正在运行一个查询来撤回在我们的系统中制作的数据,并将其与单独的发票表进行比较,该表正在工作。但是,现在我只需要将该总额(卷)仅限于发票数量大于系统中输入的日期。从同一表中选择SQL查询

这里是我的查询:

SELECT 
MIN(c.created_at) AS date, 
c.meta_account_Id, 
c.organization_Id, 
c.user_id, 
c.meta_distributorId, 
c.meta_accountName, 
CASE 
    WHEN sum(s.volumece) IS NULL THEN 0 
    ELSE sum(s.volumece) 
END AS ces 
FROM [commitments] c 
LEFT JOIN [Sales2] s ON c.organization_Id=s.org_id AND 
c.meta_account_Id=s.account_id 
WHERE c.status='active' 
GROUP BY c.meta_account_Id, c.organization_Id, c.user_id, 
c.meta_distributorId, c.meta_accountName 

这里是什么,我认为它应该看起来像,但显然不正确:

SELECT 
MIN(c.created_at) AS date, 
c.meta_account_Id, 
c.organization_Id, 
c.user_id, 
c.meta_distributorId, 
c.meta_accountName, 
CASE 
    WHEN sum(s.volumece) IS NULL THEN 0 
    ELSE (SELECT sum(s.volumece) WHERE s.invoice_date>=c.created_at) 
END AS ces 
FROM [commitments] c 
LEFT JOIN [Sales2] s ON c.organization_Id=s.org_id AND 
c.meta_account_Id=s.account_id 
WHERE c.status='active' 
GROUP BY c.meta_account_Id, c.organization_Id, c.user_id, 
c.meta_distributorId, c.meta_accountName 

基本上[Sales2]是发票和[承诺的表]是在我们的系统中创建的新发票的表格。通过account_id匹配这些数据,然后将所有数据从创建和前进的日期中拉回,在系统中输入的发票之前没有发票。

例子:

这一次真的应该总结为0 CES因为所有invoice_dates是日期是enetered

Commitments

Sales2

+2

为什么不把's.invoice_date> = c.created_at'作为另一个* join *条件? – Uueerdo

+1

样本数据和期望的结果将真正帮助您的问题。 –

+0

因为那么这个连接会缩小我的结果,我只想缩小这个“ces”的总和。基本上我想保持原样,说18行项目的结果,然后我想根据发票之后的发票总和缩小最后一个col“ces” – nickbrleet

回答

1

后,我觉得你的case语句必须在sum()子句中不在它之外。

sum(CASE WHEN s.volumece IS NULL THEN 0 
      when s.invoice_date>=c.created_at then s.volumece 
      else 0 
      end) 

尝试保持sum(case ...)而不是case when sum()end。合理? Case条款适用于每个卷,而不适用于总合计。

也许不是最优雅的情况下使用空或者有

sum(CASE when s.invoice_date>=c.created_at then coalesce(s.volumece,0) 
      else 0 
      end) 

简单的?

+0

真棒是的作品像一个魅力。并且也非常感谢你的解释,这是非常有意义的。 – nickbrleet