我有以下查询
SELECT
ROUND(SUM(IF(`VAT`<1,(`Unit_Cost`*`Quantity`)*`ExchangeRate`, 0))+SUM(DISTINCT `VATValue`),2)
FROM
`salesinvoice`
LEFT JOIN `salesinvoice_products`
ON `salesinvoice`.`SalesInvoice_id` = `salesinvoice_products`.`SalesInvoice_id`
问题是查询给了我一个不正确的结果,因为VAT
被复制了,因为这是一对多的(请记住这不是问题)。
所以我尝试了这个
ROUND(SUM(IF(SUM(DISTINCT `VAT`)<1,(`Unit_Cost`*`Quantity`)*`ExchangeRate`, 0))+SUM(DISTINCT `VATValue`),2)
哪个也没有用。显然你不能以这种方式使用DISTINCT。 所以这是我尝试使用别名的地方,但是当我尝试这个时,我会得到未知的列。所以这是我的最终代码,这是我要问的问题。
SELECT
SUM(DISTINCT `VAT`) as v,
ROUND(SUM(IF(v<1,(`Unit_Cost`*`Quantity`)*`ExchangeRate`, 0))+SUM(DISTINCT `VATValue`),2)
FROM
`salesinvoice`
LEFT JOIN `salesinvoice_products`
ON `salesinvoice`.`SalesInvoice_id` = `salesinvoice_products`.`SalesInvoice_id`
正如您所看到的,我将SUM(DISTINCT VAT)
作为v放在一个单独的列中,并希望在计算列中使用结果,但它不起作用,我不知道为什么。
Viki888建议使用子查询,所以我现在尝试了这个,但我仍然得到未知列错误。也许我做错了。这是更新的代码
SELECT
(SELECT SUM(DISTINCT `vat`) FROM `salesinvoice`)as v,
ROUND(SUM(IF(v<1,(`Unit_Cost`*`Quantity`)*`ExchangeRate`, 0))+SUM(DISTINCT `VATValue`),2)
FROM `salesinvoice`
LEFT JOIN `salesinvoice_products`
ON `salesinvoice`.`SalesInvoice_id` = `salesinvoice_products`.`SalesInvoice_id`
对,我认为我接近解决方案。这并没有给我一个错误,但是没有给我我想要的结果。我必须用行的id替换数字3,但我不确定如何将id传递给子查询
SELECT
ROUND(SUM(IF(v<1,(`Unit_Cost`*`Quantity`)*`ExchangeRate`, 0))+SUM(DISTINCT `VATValue`),2) FROM `salesinvoice`
INNER JOIN
(SELECT `vat` as v FROM `salesinvoice` WHERE `SalesInvoice_id`=3)as j
LEFT JOIN `salesinvoice_products`
ON `salesinvoice`.`SalesInvoice_id` = `salesinvoice_products`.`SalesInvoice_id`
我终于发现最好的方法是进行内联SELECT,但问题是这个。我仍然得到一个高于我应该得到的数字。所以某些地方正在复制某些东西。我开始认为我的增值税可能不是问题。
SELECT DISTINCT
ROUND(SUM(IF((SELECT DISTINCT si2.`VAT` FROM `salesinvoice` as si2 WHERE si2.`SalesInvoice_id`=si.`SalesInvoice_id`)<1,(`Unit_Cost`*`Quantity`)*`ExchangeRate`, 0))+SUM(DISTINCT `VATValue`),2) as total
FROM `salesinvoice` as si
LEFT JOIN `salesinvoice_products` as sip
ON si.`SalesInvoice_id` = sip.`SalesInvoice_id`
答案 0 :(得分:1)
我将回答我自己的问题,因为我终于想出了问题的解决方案,但不是问题的答案。这就是我根本不需要别名,我用另一种方式解决了它。所以这使我的问题无效。但无论如何我会给出答案。
SELECT DISTINCT
ROUND(SUM(IF(`VAT`<1, (`Unit_Cost`*`Quantity`)*`ExchangeRate`, 0)),2) as total
FROM `salesinvoice` as si
LEFT JOIN `salesinvoice_products` as sip
ON si.`SalesInvoice_id` = sip.`SalesInvoice_id`
最重要的是在SELECT之后放置DISTINCT,这解决了我必须拥有别名的问题。我做的另一件事是删除我添加VATValue的部分,好像没有增值税,我不需要添加该值。我觉得很蠢,我花了整整一天的时间来解决这个问题。但是,添加该值不应该改变答案,如果它是零,所以我不明白,但最后我得到它的工作。我不相信自己已经失去了很多时间,而且非常简单。
答案 1 :(得分:0)
您可以尝试以下查询,别名不适用于条件。
SELECT
SUM(DISTINCT `VAT`) as v,
ROUND(SUM(IF(SUM(DISTINCT `VAT`) < 1,(`Unit_Cost`*`Quantity`)*`ExchangeRate`, 0))+SUM(DISTINCT `VATValue`),2)
FROM
`salesinvoice`
LEFT JOIN `salesinvoice_products`
ON `salesinvoice`.`SalesInvoice_id` = `salesinvoice_products`.`SalesInvoice_id`
答案 2 :(得分:0)
您可能需要在加入salesinvoice之前分离联接,分组和聚合salesinvoice_products,然后在结果上对结果求和,从而决定您要在总和中使用什么。 也许是这样的事情。
select sum(case when vatvalue = 0 then nonvatvalue else vatvalue end) as TotalInvoice
from
(
(select si.id,
case when si.vat < 1 then 0 else si.vatvalue end as vatvalue
FROM `salesinvoice` si
) si
join (select sip.id, sumsum((`Unit_Cost`*`Quantity`)*`ExchangeRate`) nonvatvalue
from salesinvoice_products` sip group by sip.ip) sip
ON si.id = sip.id
) t