-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:=@counter + 1 DAY));
             INSERT INTO daterange26 VALUES (DATE_ADD(_fromdate, INTERVAL @counter:=@counter + 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 ;
4

1 に答える 1

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

誤った値が生成される主な理由の1つは、両方のテーブルの関係が指定されていないために、結合されたテーブルがデカルト積を生成するためです。これは、関係を持たない内部結合が定義する例です。デモについては、このリンクをクリックしてください

于 2013-01-06T13:03:52.373 に答える