我正在运行查询以撤回在我们系统中生成的数据,并将其与单独的发票表进行比较,该表正在运行。但是,现在我只需要为发票大小超过我们系统中输入的日期提取该金额(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都是在日期被激活之后
答案 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)
简单?