2011-11-04 74 views
0

试图从需要几个连接和一些数学表的计算中获得一个简单的COUNT。我不明白。我一直在遇到“无效使用组功能”。在一个类似的查询中,我得到所有的数据,只是无法计数。计算并加入MYSQL中的计算

我有4张桌子。

CUSTOMERS 
id name thegroup periodicity 
1 Foo  3  4 

GROUPS 
id group_name 
3 New York 

每位顾客都有一系列的取件日期。

COLLECTIONS 
id coll_date customer_id 
3 2011-09-07 1 
3 2011-07-21 1 

而周期表是计划的皮卡之间的周数。

PERIODS 
id duration 
4 4 

因此,持续时间4意味着每4周或28天取件。

我可以计算下一个取件日期何时接近:如果他们有28天的周期性,那么从上次取件到现在已经有21天时间了,就可以标记它了。在这种情况下,将75%通过其周期性21/28,或:

(ABS(DATEDIFF(MAX(collections.coll_date), NOW()))/(periods.duration *7)) 

如果结果大于0.75时,则它们是由于对回暖。 我可以通过客户循环,并计算出没有问题。

我的目标是: 我需要知道每个组中有多少客户需要提货,请注意:COUNT(customers)WHERE(此计算)> .75 GROUP BY group.id。

我有这个到目前为止,但不能正确。

SELECT COUNT(*), groups.id 
FROM customers 
INNER JOIN groups ON customers.thegroup = groups.id 
INNER JOIN periods ON customers.periodicity = periods.id 
LEFT JOIN collections ON customers.id = collections.rest_id 
WHERE status = 1 AND (ABS(DATEDIFF(MAX(collections.coll_date), NOW()))/(periods.duration*7)) > .75 
GROUP BY groups.id 

回答

0

要列出所有组,根据你的计算和适当地至少一个取货至少一个客户它显示有多少客户有皮卡由于使用以下

SELECT 
C.THEGROUP, 
COUNT(DISTINCT C.ID) CNT 
FROM CUSTOMERS C 
INNER JOIN PERIODS P ON C.PERIODICITY = P.ID 
LEFT OUTER JOIN (SELECT CL.REST_ID CUSTID, MAX (CL.COLL_DATE) MCOLLD FROM COLLECTIONS CL GROUP BY CL.REST_ID) X ON C.ID = X.CUSTID 
WHERE C.STATUS = 1 AND (ABS(DATEDIFF(X.MCOLLD, NOW()))/(P.DURATION*7)) > .75 
GROUP BY C.THEGROUP 

如果你想所有的组列表,包括那些没有任何拾音器使用

SELECT G.ID, IFNULL (A.CNT, 0) CNT FROM 
GROUPS G 
LEFT OUTER JOIN 
(
SELECT 
C.THEGROUP, 
COUNT(DISTINCT C.ID) CNT 
FROM CUSTOMERS C 
INNER JOIN PERIODS P ON C.PERIODICITY = P.ID 
LEFT OUTER JOIN (SELECT CL.REST_ID CUSTID, MAX (CL.COLL_DATE) MCOLLD FROM COLLECTIONS CL GROUP BY CL.REST_ID) X ON C.ID = X.CUSTID 
WHERE C.STATUS = 1 AND (ABS(DATEDIFF(X.MCOLLD, NOW()))/(P.DURATION*7)) > .75 
GROUP BY C.THEGROUP 
) A ON G.ID = A.THEGROUP 
ORDER BY G.ID 
+0

哇......这是完美的。我不能够感谢你!太快了。真棒。 – user1029213

0

不能在查询中使用periods.duration,因为它不依赖于你的GROUP BY表达。

0

MAX()是不应该后where子句中使用的聚合函数,你可以尝试having代替