我正在运行一个查询以提取我们系统中生成的数据并将其与一个单独的发票表进行比较,该表正在运行。但是,现在我只需要为大于在我们系统中输入的日期的发票提取那个 sum(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] 是一个发票表,[commitments] 是一个在我们系统中创建的新发票表。通过 account_id 匹配它们,然后从创建之日起全部拉回并继续往后,在我们系统中输入的发票之前没有任何发票。
例子:
这个总和应该为 0 ces,因为所有 invoice_dates 都在输入日期之后
最佳答案
我认为你的 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 then sum() 结束。合理? Case 子句适用于每个 volume 而不是总计。
可能也不是 null 最优雅的用法
sum( CASE when s.invoice_date>=c.created_at then coalesce(s.volumece,0)
else 0
end)
更简单?
关于mysql - 从同一表中选择的 SQL 子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46856488/