SUM () 在一个地方 - Mysql
SUM () in a where - Mysql
下面的查询显示合同的结果,其合同延迟为 between 1 and 487 days
。
现在我想添加属于 invoice.value
合同的发票的价值,然后按合同的余额进行过滤,其总额介于一个值和另一个值之间。
在这种情况下,我会有 8 个结果符合下面的查询,合同余额 between 4 and 5 dolars and delay between 1 and 487 days
,但我只得到 1 个结果,而且不正确。
我做错了什么?
tb_contract
id
contract
tb_invoice
id
contract_id
value
due_date
查询
SELECT DISTINCT `contract`.*
FROM `tb_contract` `contract`
LEFT JOIN `tb_invoice` `invoice` ON `invoice`.`contract_id` = `contract`.`id`
WHERE `contract`.`creditor_id` = '5ddf5246-fed4-4e5f-538d-34df1e8cf9ee'
AND DATEDIFF(CURDATE(), invoice.due_date) >= 1
AND DATEDIFF(CURDATE(), invoice.due_date) <= 487
GROUP BY `contract`
HAVING SUM(invoice.value) between 4.00 AND 5.00
不使用 Haveing 并使用 where invoice.value
,我收到一份合同,其中至少有一张符合参数值的发票,但是它带来了来自同一合同的其他发票,其中包含其他几张以上参数值协商。我想要的是添加合同的所有发票并仅过滤在值的参数之间。也就是说,所有合同发票加起来不能低于或高于金额
那将是另一个查询
SELECT DISTINCT `contract`.*
FROM `tb_contract` `contract` LEFT JOIN `tb_invoice` `invoice` ON `invoice`.`contract_id` = `contract`.`id`
WHERE `contract`.`creditor_id` = '5ddf5246-fed4-4e5f-538d-34df1e8cf9ee'
AND `invoice`.`value` between 4.00 AND 5.00
AND DATEDIFF(CURDATE(), invoice.due_date) >= 1
AND DATEDIFF(CURDATE(), invoice.due_date) <= 487
我对 group by
子句表示怀疑:contract
是在查询中发挥作用的任何 table 中的实际列吗?为了使您的查询有效 SQL,它需要是合同的主键 table。
我还怀疑您想要 所有发票 属于给定日期间隔的合同 - 因此日期条件应移至 having
子句。
总的来说,我认为将合同 table 与发票上的聚合子查询结合起来会更简单、更有效:
select c.*, i.total_value
from tb_contract contract c
inner join (
select contract_id, sum(value) total_value
from tb_invoice
group by contract_id
having
max(i.due_date) >= current_date - interval 487 day
and min(i.due_date) < current_date
and sum(value) >= 4
and sum(value) < 5
) i on i.contract_id = c.id
where c.creditor_id = '5ddf5246-fed4-4e5f-538d-34df1e8cf9ee'
SELECT `contract`.*,SUM(invoice.value) AS inv_tot
FROM `tb_contract` `contract`
LEFT JOIN `tb_invoice` `invoice` ON `invoice`.`contract_id` = `contract`.`id`
WHERE `contract`.`creditor_id` = '5ddf5246-fed4-4e5f-538d-34df1e8cf9ee'
AND DATEDIFF(CURDATE(), invoice.due_date) >= 1
AND DATEDIFF(CURDATE(), invoice.due_date) <= 487
GROUP BY `contract`
HAVING inv_tot between 4.00 AND 5.00
下面的查询显示合同的结果,其合同延迟为 between 1 and 487 days
。
现在我想添加属于 invoice.value
合同的发票的价值,然后按合同的余额进行过滤,其总额介于一个值和另一个值之间。
在这种情况下,我会有 8 个结果符合下面的查询,合同余额 between 4 and 5 dolars and delay between 1 and 487 days
,但我只得到 1 个结果,而且不正确。
我做错了什么?
tb_contract
id
contract
tb_invoice
id
contract_id
value
due_date
查询
SELECT DISTINCT `contract`.*
FROM `tb_contract` `contract`
LEFT JOIN `tb_invoice` `invoice` ON `invoice`.`contract_id` = `contract`.`id`
WHERE `contract`.`creditor_id` = '5ddf5246-fed4-4e5f-538d-34df1e8cf9ee'
AND DATEDIFF(CURDATE(), invoice.due_date) >= 1
AND DATEDIFF(CURDATE(), invoice.due_date) <= 487
GROUP BY `contract`
HAVING SUM(invoice.value) between 4.00 AND 5.00
不使用 Haveing 并使用 where invoice.value
,我收到一份合同,其中至少有一张符合参数值的发票,但是它带来了来自同一合同的其他发票,其中包含其他几张以上参数值协商。我想要的是添加合同的所有发票并仅过滤在值的参数之间。也就是说,所有合同发票加起来不能低于或高于金额
那将是另一个查询
SELECT DISTINCT `contract`.*
FROM `tb_contract` `contract` LEFT JOIN `tb_invoice` `invoice` ON `invoice`.`contract_id` = `contract`.`id`
WHERE `contract`.`creditor_id` = '5ddf5246-fed4-4e5f-538d-34df1e8cf9ee'
AND `invoice`.`value` between 4.00 AND 5.00
AND DATEDIFF(CURDATE(), invoice.due_date) >= 1
AND DATEDIFF(CURDATE(), invoice.due_date) <= 487
我对 group by
子句表示怀疑:contract
是在查询中发挥作用的任何 table 中的实际列吗?为了使您的查询有效 SQL,它需要是合同的主键 table。
我还怀疑您想要 所有发票 属于给定日期间隔的合同 - 因此日期条件应移至 having
子句。
总的来说,我认为将合同 table 与发票上的聚合子查询结合起来会更简单、更有效:
select c.*, i.total_value
from tb_contract contract c
inner join (
select contract_id, sum(value) total_value
from tb_invoice
group by contract_id
having
max(i.due_date) >= current_date - interval 487 day
and min(i.due_date) < current_date
and sum(value) >= 4
and sum(value) < 5
) i on i.contract_id = c.id
where c.creditor_id = '5ddf5246-fed4-4e5f-538d-34df1e8cf9ee'
SELECT `contract`.*,SUM(invoice.value) AS inv_tot
FROM `tb_contract` `contract`
LEFT JOIN `tb_invoice` `invoice` ON `invoice`.`contract_id` = `contract`.`id`
WHERE `contract`.`creditor_id` = '5ddf5246-fed4-4e5f-538d-34df1e8cf9ee'
AND DATEDIFF(CURDATE(), invoice.due_date) >= 1
AND DATEDIFF(CURDATE(), invoice.due_date) <= 487
GROUP BY `contract`
HAVING inv_tot between 4.00 AND 5.00