1

SQL ステートメントを使用してテーブル内の 2 つの行を結合する MySQL ステートメントについて問い合わせがあります。最初に、従業員のシフトをデータ グリッド ビューに表示するコードを実装しました。

LocationName | StationName | 12:00 - 13:00 | 13:00 - 14:00 | 14:00 - 15:00
T2           | Counter     | Michael Joyce | Michael Joyce | Michael Joyce

ご覧のとおり、同じ Location と Station の下に 2 人の従業員がいます。次のステップでは、SQL ステートメントを使用して形式を入力し、最終的に SQL ステートメントを使用してレポート ビューアーを作成します。

これは、上記と同じ形式で表示しようとした SQL ステートメントです。

select
  z.LocationName,
  z.StationName,
  a.12001300,
  b.13001400,
  c.14001500
from (SELECT DISTINCT
        LocationName,
        StationName
      FROM satsschema.employeeslot
      where AllocationDate = '10-Aug'
          and LocationName = 'T2 PML'
          and StationName is not null) z
  left outer join (SELECT
                     LocationName,
                     StationName,
                     EmpName         AS '12001300'
                   FROM satsschema.employeeslot
                   WHERE Assigned = true
                       and AllocationDate = '10-Aug'
                       and (EmpTime = '12:00:00' && EmpTime < '13:00:00')) a
    on z.LocationName = a.LocationName
      and z.StationName = a.StationName
  left outer join (SELECT
                     LocationName,
                     StationName,
                     EmpName         AS '13001400'
                   FROM satsschema.employeeslot
                   WHERE Assigned = true
                       and AllocationDate = '10-Aug'
                       and (EmpTime = '13:00:00' && EmpTime < '14:00:00')) b
    on a.LocationName = b.LocationName
      and a.StationName = b.StationName
  left outer join (SELECT
                     LocationName,
                     StationName,
                     EmpName         AS '14001500'
                   FROM satsschema.employeeslot
                   WHERE Assigned = true
                       and AllocationDate = '10-Aug'
                       and (EmpTime = '14:00:00' && EmpTime < '15:00:00')) c
    on b.LocationName = c.LocationName
      and b.StationName = c.StationName

上記の SQL ステートメントは、私が望んでいたものと一致しない次の結果を示しました。次のように表示されます。

LocationName | StationName | 12:00 - 13:00 | 13:00 - 14:00 | 14:00 - 15:00
T2           | Counter     | Michael       | Michael       | Michael

ご覧のとおり、Location と Station には 1 人の従業員のみが表示されます。ロケーションとステーション内に複数の従業員がいる場合、他の従業員も見ることができるというSQLステートメントをどのように実行できますか。ご意見はありますか?

4

1 に答える 1

1

GROUP_CONCATを使用します。複数のMySQL行を1つのフィールドに連結できますか?を参照してください。

次のようなもの:

SELECT z.LocationName, z.StationName, Block12.EmpList, Block13.EmpList, Block14.EmpList
FROM satsschema.employeeslot z
LEFT OUTER JOIN
(
    SELECT LocationName, StationName, GROUP_CONCAT(EmpName) AS EmpList
    FROM satsschema.employeeslot
    WHERE Assigned = true
        AND AllocationDate = '10-Aug'
        AND (EmpTime = '12:00:00' && EmpTime < '13:00:00')
    GROUP BY LocationName, StationName
) Block12
ON z.LocationName = Block12.LocationName
    AND z.StationName = Block12.StationName
LEFT OUTER JOIN
(
    SELECT LocationName, StationName, GROUP_CONCAT(EmpName) AS EmpList
    FROM satsschema.employeeslot
    WHERE Assigned = true
        AND AllocationDate = '10-Aug'
        AND (EmpTime = '13:00:00' && EmpTime < '14:00:00')
    GROUP BY LocationName, StationName
) Block13
ON z.LocationName = Block13.LocationName
    AND z.StationName = Block13.StationName
LEFT OUTER JOIN
(
    SELECT LocationName, StationName, GROUP_CONCAT(EmpName) AS EmpList
    FROM satsschema.employeeslot
    WHERE Assigned = true
        AND AllocationDate = '10-Aug'
        AND (EmpTime = '14:00:00' && EmpTime < '15:00:00')
    GROUP BY LocationName, StationName
) Block14
ON z.LocationName = Block14.LocationName
    AND z.StationName = Block14.StationName
WHERE AllocationDate = '10-Aug'
GROUP BY z.LocationName, z.StationName
于 2012-09-04T03:43:00.293 に答える