2014-09-30 41 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

只有一次
相關問題