2016-11-07 30 views
0

我有以下查询mysql的别名给未知列

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

尝试嵌套查询。首先在**内部查询**中将** SUM DISTINCT **,然后在**外部查询**中,您可以访问值** v **。 – Viki888

+0

您不能将聚合列的结果用作同一查询的一部分(除了在HAVING子句中)。 @ viki888建议是一种方式。 – PaulF

回答

0

我要回答我自己的问题,因为我终于想出了问题的解决方案,但不是问题的答案。这就是我根本不需要别名,我以另一种方式解决了它。所以这使我的问题无效。不过,无论如何,我会回答我的答案。

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的部分,就好像没有增值税我不需要添加该值。我感到很蠢,以至于花了我整整一天的时间来解决这个问题。但是,如果添加该值不应该改变答案,如果它是零,所以我不明白,但最终我得到它的工作。不能相信我在很简单的事情上损失了太多时间。

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` 
+0

如果你看看我的第二点代码,你会看到我已经试过这个,我得到这个错误#1111 - 组函数的无效使用。不管怎么说,还是要谢谢你 –

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