Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Policz dane z wielu tabel za pomocą SUM

Zamiast dołączać do tbl_workers możesz dołączyć do jego nieobrotowej odmiany, gdzie position i position2 będzie w tej samej kolumnie, ale w różnych rzędach.

Oto jak może wyglądać unpivoting:

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

Oto całe zapytanie, które jest w zasadzie Twoim pierwotnym zapytaniem z powyższym zapytaniem zastępującym tbl_workers tabela:

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

AKTUALIZUJ

To jest zmodyfikowany skrypt zgodnie z dodatkową prośbą w komentarzach:

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

Pomysł polega na zastąpieniu 4 status w podselekcji za pomocą 3 lub 2 w zależności od tego, czy aktualnie mamy ciągnąć position lub position2 jako ujednolicona position . Zewnętrzny wybór nadal używa tej samej logiki, co wcześniej.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wielotabelowe zapytanie MySQL zwracające zbyt wiele wyników

  2. Twórz wiele tabel, cyklicznie przechodząc przez zapytanie

  3. Połączenie MySQL z trikiem 3 tabel

  4. Jak używać MAX w MySQL?

  5. Zaktualizuj wiązkę za pomocą CodeIgniter