sql >> Databasteknik >  >> RDS >> Mysql

Räkna data från flera tabeller med hjälp av SUM

Istället för att gå med i tbl_workers du kan gå med i dess opivoterade variant där position och position2 skulle vara i samma kolumn men i olika rader.

Så här kan osvängningen se ut:

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

Här är hela frågan, som i princip är din ursprungliga fråga med ovanstående fråga som ersätter tbl_workers tabell:

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

UPPDATERA

Detta är ett modifierat skript enligt ytterligare begäran i kommentarer:

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

Tanken är att ersätta 4 status i undervalet med 3 eller 2 beroende på om vi för närvarande ska dra position eller position2 som den förenade position . Det yttre valet fortsätter att använda samma logik som tidigare.



  1. komplex sql ordning efter

  2. Ställ in inmatningsvärde vid val av alternativ i php

  3. SELECT vs UPDATE prestanda med index

  4. Endast läsåtkomst till lagrat procedurinnehåll