2013-01-06 52 views
-1

計數功能沒有正確顯示記錄。計數功能沒有返回正確的記錄數

DELIMITER $$ 

    DROP PROCEDURE IF EXISTS `AbsentReportproctest`$$ 

    CREATE DEFINER=`root`@`localhost` PROCEDURE `AbsentReportproctest`(IN _fromdate DATETIME, IN _todate DATETIME) 
    BEGIN 
     CREATE TEMPORARY TABLE daterange25 (dte DATE); 

      CREATE TEMPORARY TABLE daterange26 (dte DATE); 

     SET @counter := -1; 
     WHILE (@counter < DATEDIFF(DATE(_todate), DATE(_fromdate))) DO 
      INSERT INTO daterange25 VALUES (DATE_ADD(_fromdate, INTERVAL @counter:[email protected] + 1 DAY)); 
      INSERT INTO daterange26 VALUES (DATE_ADD(_fromdate, INTERVAL @counter:[email protected] + 1 DAY)); 

     END WHILE; 



    SELECT tp.EMPCODE, d.dte,gc.count 
    FROM test_prefixmaster tp 
    INNER JOIN(SELECT tp.EMPCODE,COUNT(*)AS count 
    FROM test_prefixmaster tp 
    JOIN daterange26 d 
    LEFT JOIN test_prefixtransactions tpt ON (tp.EMPCODE = tpt.empcode) 
    AND DATE(S_DateTime) = d.dte 
    WHERE tpt.empcode IS NULL 
    GROUP BY tp.EMPCODE) gc on tp.EMPCODE = gc.EMPCODE 
    JOIN daterange25 d 
    LEFT JOIN test_prefixtransactions tpt ON (tp.EMPCODE = tpt.empcode) 
    AND DATE(S_DateTime) = d.dte 
    WHERE tpt.empcode IS NULL; 




    DROP TABLE daterange25; 

    DROP TABLE daterange26; 


    END$$ 

    DELIMITER ; 
+1

請添加更多的細節(例如樣本數據,表格結構)來解釋發生了什麼問題。這不是代碼評論網站 –

+0

請檢查此鏈接http://stackoverflow.com/questions/14162822/how-to-display-string-of-records-row-by-row-in-mysql – String

+0

請檢查此SQL小提琴演示http://www.sqlfiddle.com/#!2/223a1a – String

回答

2

我不知道這是不是一個錯字在你的問題或沒有,但你的加入,我發現你沒有提供你的表之間ON條款,

SELECT tp.EMPCODE, 
     d.dte, 
     gc.count 
FROM test_prefixmaster tp 
     INNER JOIN 
     (
      SELECT tp.EMPCODE, 
        COUNT(*) AS count 
      FROM test_prefixmaster tp 
        INNER JOIN daterange26 d 
         -- where is the ON clause here ?? 
        LEFT JOIN test_prefixtransactions tpt 
         ON (tp.EMPCODE = tpt.empcode) 
          AND DATE (S_DateTime) = d.dte 
      WHERE tpt.empcode IS NULL 
      GROUP BY tp.EMPCODE 
     ) gc 
      ON tp.EMPCODE = gc.EMPCODE 
     INNER JOIN daterange25 d 
       -- where is the ON clause here ?? 
     LEFT JOIN test_prefixtransactions tpt 
      ON (tp.EMPCODE = tpt.empcode) 
       AND DATE (S_DateTime) = d.dte 
WHERE tpt.empcode IS NULL 

產生不正確值的主要原因之一是,因爲由於未指定兩個表的關係,所以連接表產生笛卡爾積。這裏有一個例子,說明一個沒有關係的內部連接定義Click this link for demo

+0

我想查找給定兩個日期的員工缺席細節範圍? – String

+0

你可以在你的問題上添加期望結果的樣本記錄嗎? –

+0

我給這個示例SQL FIddle在這裏http://www.sqlfiddle.com/#!2/223a1a – String