2014-03-28 36 views
0

我有一個車間訂單表。這些訂單有一個布爾屬性,表明它們是否需要交付給客戶或不交付給客戶。還有另一張表格說明訂單是否完整。試圖在MySQL中的單個查詢中選擇多個計數

我想統計交付的發票數量,剩餘發票數,然後只是完成(支付)的發票總數。

這是我迄今爲止嘗試:

SELECT 
    COUNT(SELECT INVOICE_ID FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC WHERE TO_DELIVER = 1 AND I.INVOICE_ID = IC.INVOICE_ID AND IC.COMPLETE = 1) AS DELIVERED, 
    COUNT(SELECT INVOICE_ID FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC WHERE TO_DELIVER = 0 AND I.INVOICE_ID = IC.INVOICE_ID AND IC.COMPLETE = 1) AS REMAINING, 
    COUNT(INVOICE_ID) AS TOTAL 
FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC 
WHERE TO_DELIVER = 1 
AND I.INVOICE_ID = IC.INVOICE_ID 

它扔以下語法錯誤:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT INVOICE_ID FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC WHERE TO_DELIVE' at line 2 

我要去哪裏錯在這裏。這是我第一次試圖嵌套這樣的陳述。

+0

使用CASE語法 – Mihai

回答

0

還有一個更簡單的方法:外連接invoice_complete和計數比賽:

SELECT 
    COUNT(IC.INVOICE_ID) AS DELIVERED, 
    COUNT(*) - COUNT(IC.INVOICE_ID) AS REMAINING, 
    COUNT(*) AS TOTAL 
FROM INVOICE_LINE AS I 
LEFT JOIN INVOICE_COMPLETE AS IC ON I.INVOICE_ID = IC.INVOICE_ID AND IC.COMPLETE = 1 
WHERE TO_DELIVER = 1; 

編輯:嗯,我也要你做了什麼錯誤解釋:計數需要*,一列或表達式。對於列或表達式來說,它會計算非空的出現次數,因爲它計數記錄。您可以使用將SELECT語句作爲一個表達式,但那麼它必須有額外的括號內必須完成一個from子句:select count((select x from y)) from ...

最後一個忠告:使用顯式連接語法(INNER JOIN x開... ,LEFT JOIN y ON ...等),而不是隻用逗號列出表格。這增強了可讀性並有助於避免錯誤。

+0

你能解釋一下什麼是與左連接發生了什麼? – crm

+0

是的。 SELECT * from A LEFT JOIN B ON A.x = B.y.如果A.x匹配,那麼你就像正常一樣加入。然而,如果A.x沒有匹配,那麼你得到了A記錄與一個空的B記錄(B字段爲NULL,然後,例如B.y爲NULL)。 –

+0

我只注意到我的select語句不正確。我(並且仍然)與id.complete和to_deliver混淆。 to_deliver屬於表invoice_line?你算什麼:(to_deliver,complete)=>(1,1)=交付,(0,1)=剩餘,(\ *,\ *)=總計?或(1,\ *)=總數?或(\ *,1)=總數? –

0

你可以寫這樣的:

declare @toDeliver as int = (SELECT COUNT(INVOICE_ID) FROM INVOICE_LINE AS I, INVOICE_COMPLETE  AS IC WHERE TO_DELIVER = 0 AND I.INVOICE_ID = IC.INVOICE_ID AND IC.COMPLETE = 1) 
declare @deliverd as int = (SELECT COUNT(INVOICE_ID) FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC WHERE TO_DELIVER = 1 AND I.INVOICE_ID = IC.INVOICE_ID AND IC.COMPLETE = 1) 
SELECT 
    @toDeliver as REMAINING, 
    @delivered as DELIVERED, 
    @toDeliver + @delivered AS TOTAL 
0

其他的答案給你如何做到這一點更好的想法。

但是,這個錯誤似乎來自計數函數內的子查詢。

這種變化可能會爲你工作:

SELECT 
    (SELECT COUNT(INVOICE_ID) FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC WHERE TO_DELIVER = 1 AND I.INVOICE_ID = IC.INVOICE_ID AND IC.COMPLETE = 1) AS DELIVERED, 
    (SELECT COUNT(INVOICE_ID) FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC WHERE TO_DELIVER = 0 AND I.INVOICE_ID = IC.INVOICE_ID AND IC.COMPLETE = 1) AS REMAINING, 
    COUNT(INVOICE_ID) AS TOTAL 
FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC 
WHERE TO_DELIVER = 1 
AND I.INVOICE_ID = IC.INVOICE_ID 

這只是將子查詢中的計數。

或者周圍添加子查詢括號:

SELECT 
    COUNT((SELECT INVOICE_ID FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC WHERE TO_DELIVER = 1 AND I.INVOICE_ID = IC.INVOICE_ID AND IC.COMPLETE = 1)) AS DELIVERED, 
    COUNT((SELECT INVOICE_ID FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC WHERE TO_DELIVER = 0 AND I.INVOICE_ID = IC.INVOICE_ID AND IC.COMPLETE = 1)) AS REMAINING, 
    COUNT(INVOICE_ID) AS TOTAL 
FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC 
WHERE TO_DELIVER = 1 
AND I.INVOICE_ID = IC.INVOICE_ID 
; 
相關問題