从同一个表中选择SQL子查询

时间:2017-10-20 20:01:01

标签: mysql sql

我正在运行查询以撤回在我们系统中生成的数据,并将其与单独的发票表进行比较,该表正在运行。但是,现在我只需要为发票大小超过我们系统中输入的日期提取该金额(volumnece)。

这是我的问题:

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都是在日期被激活之后

Commitments

Sales2

1 个答案:

答案 0 :(得分: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。合理? Case子句适用于每个volumece而不适用于总聚合。

可能不是最优雅地使用案例null

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

简单?