2014-09-30 65 views
1

我有一个以EID作为主键(它是一个varchar并包含一些细节)和uploadtime作为日期时间列的表。我想要的结果,从这个表:在select子句中分配和使用mysql用户变量

substr(eid,5,5) as machine | count(eid) in group(grouped by machine) as packets | AvgDelay (as shown in SQL code) | packets * AvgDelay as Penalty 

但最后一栏总是空。我使用的SQL是:

SELECT substr(eid, 5, 5) AS machine, 
@packetcount: = count(*) AS packets, 
@avg_delay: = round(avg(DATEDIFF(IF (STR_TO_DATE(uploadtime, '%Y-%m-%d') IS NULL, CURDATE(), STR_TO_DATE(uploadtime, '%Y-%m-%d')), STR_TO_DATE(SUBSTR(eid, 15, 8), '%Y%m%d')))) AS AvgDelay, 
@packetcount * @avg_delay AS Penalty 
FROM eidreport 
WHERE uploadtime IS NOT NULL 
OR DATEDIFF(IF (STR_TO_DATE(uploadtime, '%Y-%m-%d') IS NULL, CURDATE(), STR_TO_DATE(uploadtime, '%Y-%m-%d')), STR_TO_DATE(SUBSTR(eid, 15, 8), '%Y%m%d')) >= 100 
GROUP BY machine 

Here is the link for SQL Fiddle

我在哪里错了?请帮忙。提前致谢。

回答

0

我觉得这里的问题在GROUP BY声明中。我认为@packetcount: = count(*)分组后计算,但@packetcount * @avg_delay之前,所以他们是在这个时刻未定义。

尝试使用子查询是这样的:

SELECT *, 
packets * AvgDelay AS Penalty 

FROM 
(
select substr(eid,5,5) as machine,count(*) as packets, 
round(avg(DATEDIFF(IF(STR_TO_DATE(uploadtime, '%Y-%m-%d') IS NULL, CURDATE(), STR_TO_DATE(uploadtime, '%Y-%m-%d')), 
         STR_TO_DATE(SUBSTR(eid, 15, 8),'%Y%m%d')))) AS AvgDelay 
from eidreport 
where uploadtime is not null or 
DATEDIFF(
    IF(STR_TO_DATE(uploadtime, '%Y-%m-%d') IS NULL, CURDATE(), STR_TO_DATE(uploadtime, '%Y-%m-%d')), 
    STR_TO_DATE(SUBSTR(eid, 15, 8),'%Y%m%d')) >= 100 
group by machine 
) as T 

SQLFiddle example

0

为什么使用子查询时,没有必要:

SELECT 
    SUBSTR(eid,5,5) machine, 
    COUNT(1) packets, 
    ROUND(AVG(DATEDIFF(IF (STR_TO_DATE(uploadtime, '%Y-%m-%d') IS NULL, 
         CURDATE(), STR_TO_DATE(uploadtime, '%Y-%m-%d')), 
         STR_TO_DATE(SUBSTR(eid, 15, 8), '%Y%m%d')))) AvgDelay, 
    COUNT(1) * ROUND(AVG(DATEDIFF(IF (STR_TO_DATE(uploadtime, '%Y-%m-%d') IS NULL, 
         CURDATE(), STR_TO_DATE(uploadtime, '%Y-%m-%d')), 
         STR_TO_DATE(SUBSTR(eid, 15, 8), '%Y%m%d')))) Penalty 
FROM 
    eidreport 
WHERE uploadtime IS NOT NULL 
OR DATEDIFF(IF (STR_TO_DATE(uploadtime, '%Y-%m-%d') IS NULL, CURDATE(), 
      STR_TO_DATE(uploadtime, '%Y-%m-%d')), 
      STR_TO_DATE(SUBSTR(eid, 15, 8), '%Y%m%d')) >= 100 
GROUP BY machine 

的optimers评估相同expresions

只有一次