sql >> データベース >  >> RDS >> Mysql

SUMを使用して複数のテーブルからデータをカウントします

    tbl_workersに参加する代わりに positionのピボットされていないバリエーションに参加できます およびposition2 同じ列にありますが、行は異なります。

    ピボット解除は次のようになります。

    SELECT
      w.id,
      w.name,
      CASE x.pos WHEN 1 THEN w.position ELSE w.position2 END AS position,
      w.status
    FROM tbl_workers AS w
      CROSS JOIN (SELECT 1 AS pos UNION ALL SELECT 2) AS x
    

    これがクエリ全体です。これは基本的に、tbl_workersの代わりに上記のクエリを使用した元のクエリです。 テーブル:

    SELECT p.id, 
      p.position, 
      SUM(CASE w.Status WHEN 2 THEN 1 ELSE 0 END)  AS booked,
      SUM(CASE w.Status WHEN 3 THEN 1 ELSE 0 END)  AS placed
    FROM tbl_positions AS p
      LEFT JOIN (
        SELECT
          w.id,
          w.name,
          CASE x.pos WHEN 1 THEN w.position ELSE w.position2 END AS position,
          w.status
        FROM tbl_workers AS w
          CROSS JOIN (SELECT 1 AS pos UNION ALL SELECT 2) AS x
      ) AS w 
      ON w.position=p.id
    GROUP BY p.id, p.position
    

    更新

    これは、コメントの追加リクエストに応じて変更されたスクリプトです:

    SELECT p.id, 
      p.position, 
      SUM(CASE w.Status WHEN 2 THEN 1 ELSE 0 END)  AS booked,
      SUM(CASE w.Status WHEN 3 THEN 1 ELSE 0 END)  AS placed
    FROM tbl_positions AS p
      LEFT JOIN (
        SELECT
          w.id,
          w.name,
          CASE x.pos WHEN 1 THEN w.position ELSE w.position2 END AS position,
          CASE w.status
            WHEN 4 THEN CASE x.pos WHEN 1 THEN 3 ELSE 2 END
            ELSE w.status
          END AS status
        FROM tbl_workers AS w
          CROSS JOIN (SELECT 1 AS pos UNION ALL SELECT 2) AS x
      ) AS w 
      ON w.position=p.id
    GROUP BY p.id, p.position
    

    アイデアは、4を置き換えることです 3の副選択のステータス または2 現在positionをプルするかどうかによって異なります またはposition2 統一されたpositionとして 。外側の選択は、以前と同じロジックを使用し続けます。



    1. OpenshiftでDB接続を開く方法は?

    2. LongからVarchar2への変換

    3. MariaDBでのHOUR()のしくみ

    4. oracle.sql.ARRAYオブジェクトを作成するにはどうすればよいですか?