2016-11-07 66 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