6

目的とこれまでに得たもの

不足している労働トランザクションをチェックするビューを作成しようとしています。ビューは Crystal レポートにフィードされます。

この場合、ビューは sysdate+30 から sysdate -30 までのすべての日付を取得し、それらの日付ごとにアクティブな従業員によるすべての労働記録を外部結合する必要があります。次に、日付ごとに各従業員の労務トランザクション数をカウントします。

これは Crystal Report に渡され、特定の日付範囲 (ビューによる +/- 30 の範囲内) に基づいてフィルター処理されます。そこから、すべての日数が Crystal の従業員ごとに合計され、トランザクションがゼロの従業員が表示されます。

問題

すべての日付のリストを吐き出さずに、最初は日付ごとに労働トランザクションを使用していますが、日付のカウントがないものもあります。これらの人々は、ゼロ時間でヌルの取引日を示しています。これは、期間全体で料金が発生しないことを示しており、これは理にかなっています。

ただし、Crystal がそのデータをフィルター処理して範囲を選択すると、これらの null 値が除外されるため、時間がない人をすべて表示することができないと思います。

質問

ビューで「(sysdate+30) と (sysdate-30) の間のすべての日付を選択する」に相当する方法はありますか?

SQL(参考)

SELECT QUERY.LABORRECLABORCODE
       , QUERY.LABORRECEMPLOYEENUM
       , QUERY.PERSONRECDISPLAYNAME
       , QUERY.TRANSSTARTDATE
       , COUNT(TRANSROWSTAMP) AS ROWCOUNT
FROM   (SELECT *
        FROM  (SELECT LABOR.LABORCODE      AS LABORRECLABORCODE
                      , LABOR.LA20         AS LABORRECEMPLOYEENUM
                      , PERSON.DISPLAYNAME AS PERSONRECDISPLAYNAME
               FROM   LABOR
                      LEFT OUTER JOIN PERSON
                        ON ( LABOR.LABORCODE = PERSON.PERSONID )
               WHERE  LABOR.STATUS = 'ACTIVE'
                  AND LABOR.LA20 IS NOT NULL
                  AND PERSON.DISPLAYNAME IS NOT NULL
                  AND LOWER(PERSON.DISPLAYNAME) NOT LIKE '%kimball%'
                  AND LOWER(PERSON.DISPLAYNAME) NOT LIKE '%electrico%'
                  AND LOWER(PERSON.DISPLAYNAME) NOT LIKE '%misc labor cost adj%'
                  AND LOWER(PERSON.DISPLAYNAME) NOT LIKE '%brossoit%'
                  AND LOWER(PERSON.DISPLAYNAME) NOT LIKE '%brossiot%')PERSONINFO
              LEFT OUTER JOIN (SELECT STARTDATE   AS TRANSSTARTDATE
                                      , LABORCODE AS TRANSLABORCODE
                                      , ROWSTAMP  AS TRANSROWSTAMP
                               FROM   LABTRANS
                               WHERE  STARTDATE BETWEEN ( SYSDATE - 30 ) AND ( SYSDATE + 30 ))LABTRANSLIMITED
                ON ( PERSONINFO.LABORRECLABORCODE = LABTRANSLIMITED.TRANSLABORCODE ))QUERY
GROUP  BY LABORRECLABORCODE
          , TRANSSTARTDATE
          , LABORRECEMPLOYEENUM
          , PERSONRECDISPLAYNAME
ORDER  BY LABORRECLABORCODE
          , TRANSSTARTDATE
; 
4

3 に答える 3

17
select trunc(sysdate)+31-level from dual connect by level <=61

これは、値の任意のリストを生成するのに適した方法です。

于 2012-02-06T20:40:47.150 に答える
0

または別の方法: 行数の多いテーブルを選ぶ

select sysdate+30 - rownum from user_objects where rownum<61
于 2012-02-06T20:45:42.773 に答える
0

範囲内で sysdate -30 および sysdate + 30 であるという私の要件を満たすために、これは今のところ最もエレガントな方法のようです。

SELECT *
FROM   (SELECT TRUNC(SYSDATE - ROWNUM) DT
        FROM   DUAL
        CONNECT BY ROWNUM < 31
        UNION
        SELECT TRUNC(SYSDATE + ROWNUM) DT
        FROM   DUAL
        CONNECT BY ROWNUM < 31)DATERANGE; 

私はこのSO質問からのこの回答を使用し、その考えを拡張して、ユニオンを使用して別々の方向に進んだクエリを結合しました.

于 2012-02-06T21:10:29.550 に答える