Mysql别名给出了未知列

时间:2016-11-07 10:21:03

标签: 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`

3 个答案:

答案 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