2

従業員名をグループ化する必要があります。「並べ替え」を使用しようとしましたが、空のセルでは機能しませんでした。

ここに画像の説明を入力

上の表が現在の表で、下の表のような結果が必要です。これが私の現在の選択クエリです。

SELECT 
    DAYNAME(calendar.DATE) AS DAY,
    DATE_FORMAT(calendar.DATE, '%d %b %Y') AS Date,
    t2.Department,
    t2.Name,
    TIME(t2.time_enter) AS 'Time In',
    TIME(t2.time_exit) AS 'Time Out'
FROM
    calendar
        LEFT JOIN
    (SELECT 
        employee_hr_id,
            time_enter,
            time_exit,
            department.NAME As Department,
            CONCAT(employee.F_NAME, ' ', employee.L_NAME) As Name
    from
        entry_log
    Inner Join employee ON entry_log.EMPLOYEE_HR_ID = employee.HR_ID
    Inner Join department ON employee.DEPARTMENT_ID = department.ID
    where
        CONCAT(employee.F_NAME, ' ', employee.L_NAME) LIKE @NAME) t2 ON date(t2.time_enter) = calendar.date
where
    calendar.DATE >= @TIME_ENTER
        AND calendar.DATE <= @TIME_EXIT
4

2 に答える 2

2

CALENDAR テーブルだけでなく、次のサブクエリを使用する必要があります。

select calendar.DATE,employee.HR_ID,employee.DEPARTMENT_ID 
  from calendar,employee 
  where
    calendar.DATE >= @TIME_ENTER
        AND calendar.DATE <= @TIME_EXIT

この場合、DATE と EMPLOYEE のすべての可能な組み合わせを取得します。そして、DEPARTMENT_ID, HR_ID, DATEこのテーブルから注文します。

したがって、クエリは次のようになります。

SELECT 
    DAYNAME(NEW_calendar.DATE) AS DAY,
    DATE_FORMAT(NEW_calendar.DATE, '%d %b %Y') AS Date,
    t2.Department,
    t2.Name,
    TIME(t2.time_enter) AS 'Time In',
    TIME(t2.time_exit) AS 'Time Out'
FROM
    (
       select calendar.DATE as DATE,
              employee.HR_ID as HR_ID,
              employee.DEPARTMENT_ID as DEPARTMENT_ID
            from calendar,employee 
            where
              calendar.DATE >= @TIME_ENTER
                AND calendar.DATE <= @TIME_EXIT
     ) NEW_calendar
        LEFT JOIN
    (SELECT 
        employee_hr_id,
            time_enter,
            time_exit,
            department.NAME As Department,
            CONCAT(employee.F_NAME, ' ', employee.L_NAME) As Name
    from
        entry_log
    Inner Join employee ON entry_log.EMPLOYEE_HR_ID = employee.HR_ID
    Inner Join department ON employee.DEPARTMENT_ID = department.ID
    where
        CONCAT(employee.F_NAME, ' ', employee.L_NAME) LIKE @NAME) t2 

        ON date(t2.time_enter) = NEW_calendar.date
           and (t2.EMPLOYEE_HR_ID=NEW_calendar.HR_ID)
where
    calendar.DATE >= @TIME_ENTER
        AND calendar.DATE <= @TIME_EXIT

order by NEW_calendar.DEPARTMENT_ID,NEW_calendar.HR_ID,NEW_calendar.Date
于 2013-04-25T08:35:35.463 に答える
1

空の行には、関連付ける従業員を示すものは何もありません。実際、それらはまったく複製されるべきではありません。その方法は、3 つのテーブル (またはサブクエリ) を結合することです。1 つは日付用、2 番目はすべての(関連する) 従業員用、3 番目は実際の割り当て用です。次に、名前を出力しないことを選択した場合でも、すべての従業員の 2 番目のテーブルを使用して行を並べ替えることができます。最初の 2 つのテーブルを完全にクロス結合すると、日付と従業員の間のすべての組み合わせが得られ、ログ エントリのあるものはそれに結合したままにすることができます。

SQLFiddle で例を作成しました。ID の代わりに従業員の名前を使用して照合しt2、より複雑なサブクエリの代わりにテーブルを使用しますが、それでもアイデアはクリーンである必要があります。そのフィドルからのクエリは次のとおりです。

SELECT …
FROM
    (calendar,
     (SELECT DISTINCT Name FROM t2) AS employees)
    LEFT JOIN t2 ON DATE(t2.time_enter) = calendar.date
                AND t2.Name = employees.Name
ORDER BY employees.Name, calendar.date
于 2013-04-25T09:10:30.820 に答える