sql >> Databáze >  >> RDS >> Mysql

Počítejte data z více tabulek pomocí SUM

Namísto připojení k tbl_workers můžete se připojit k jeho neotočné variantě kde position a position2 bude ve stejném sloupci, ale v různých řádcích.

Zde je návod, jak může zrušení otáčení vypadat:

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

Zde je celý dotaz, což je v podstatě váš původní dotaz s výše uvedeným dotazem nahrazujícím tbl_workers tabulka:

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

AKTUALIZACE

Toto je upravený skript podle dodatečného požadavku v komentářích:

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

Cílem je nahradit 4 stav v podvýběru s 3 nebo 2 v závislosti na tom, zda máme aktuálně vytáhnout position nebo position2 jako jednotnou position . Vnější výběr používá stejnou logiku jako předtím.



  1. Jak získat záznamy za posledních 7 dní v MySQL

  2. Počet výskytů určitého znaku v řetězci

  3. Vysvětlení operátora MariaDB INTERSECT

  4. Jak se dostanete k limitům 8060 bajtů na řádek a 8000 na hodnotu (varchar, nvarchar)?