2012-12-21 24 views
1

的我有以下MySQL查詢輸出下面的圖像:MySQL的使用邏輯在where子句+無效使用組功能

select 
    v.invoicenumber, 
    v.invoicedate, 
    v.haulier, 
    v.transporttype, 
    count(v.loadnumber) as totalloads, 
    sum(v.cost) as totalcost, 
    concat(SUM(if(invoiceapproved = 'yes', 1, 0)),'/',count(v.loadnumber)) AS count, SUM(if(invoiceapproved = 'yes', 1, 0)) as approved 
from v2loads v 
    where v.invoiced='yes' 
    group by invoicenumber 

enter image description here 此查詢excutes 100%。

我想要做的是過濾出數量爲100%的任何行/數據。在示例輸出中,我想過濾掉髮票16,因爲它是2/2和100%。所以其中

count(v.loadnumber) <> SUM(if(invoiceapproved = 'yes', 1, 0)) 

如果我將此邏輯添加到where子句中,它會失敗,錯誤無效使用組函數。所以下面的代碼無法正常工作:

select v.invoicenumber, 
    v.invoicedate, 
    v.haulier, 
    v.transporttype, 
    count(v.loadnumber) as totalloads, 
    sum(v.cost) as totalcost, 
    concat(SUM(if(invoiceapproved = 'yes', 1, 0)),'/',count(v.loadnumber)) AS count, 
    SUM(if(invoiceapproved = 'yes', 1, 0)) as approved 
from v2loads v 
    where v.invoiced='yes' and 
    (count(v.loadnumber))<>(SUM(if(invoiceapproved = 'yes', 1, 0))) 
    group by invoicenumber 

我得到了以下錯誤:

error is #1111 - Invalid use of group function.

讚賞一如既往任何意見。

回答

1

你可以這樣做:

SELECT 
    *, 
    CONCAT(approved, '/', totalloads) AS count, 
FROM 
(
    SELECT 
     v.invoicenumber, 
     v.invoicedate, 
     v.haulier, 
     v.transporttype, 
     COUNT(v.loadnumber)     AS totalloads, 
     SUM(v.cost)       AS totalcost, 
     SUM(if(invoiceapproved = 'yes', 1, 0)) As approved 
    FROM v2loads v 
    WHERE v.invoiced='yes' 
    GROUP BY invoicenumber 
) t 
WHERE totalloads <> approved; 
+0

真棒,是的,你是對的,從來沒有想過它築巢的。謝謝Mahmoud。 – Smudger

0
select v.invoicenumber, 
v.invoicedate, 
v.haulier, 
v.transporttype, 
count(v.loadnumber) as totalloads, 
sum(v.cost) as totalcost, 
concat(SUM(if(invoiceapproved = 'yes', 1, 0)),'/',count(v.loadnumber)) AS count, 
SUM(if(invoiceapproved = 'yes', 1, 0)) as approved 
from v2loads v 
where v.invoiced='yes' 
group by invoicenumber 
having (count(v.loadnumber))<>(SUM(if(invoiceapproved = 'yes', 1, 0)))