mysql - 使用 SUM 计算多个表中的数据

标签 mysql sql sum

我有位置表

tbl_positions
   id position
    1 Driver
    2 Lobby
    3 Support
    4 Constructor 

在其他表中我有用户

编辑:

   tbl_workers
      id   name   position position2 status
       1   John   2        3         4
       2   Mike   3        2         2
       3   Kate   2        0         3
       4   Andy   1        0         0

我确实要求职位

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 tbl_workers AS w 
      ON w.position=p.id
GROUP BY p.id, p.position

我在单个查询中需要这样的输出。

Position    booked placed
Driver        0       0
Lobby         1       2
Support       0       2
Constructor   0       0

我需要评估字段 positon1 和 position2 而不是一个。我认为修改它很容易,但我找不到合适的解决方案,请帮忙。

编辑:添加状态 4

最佳答案

除了加入 tbl_workers,您还可以加入它的非透视变体,其中 positionposition2 将在同一列但在不同的行中.

这是逆透视的样子:

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

想法是用 32 替换子选择中的 4 状态,具体取决于我们当前是否要拉取 positionposition2 作为统一的 position。外部选择继续使用与以前相同的逻辑。

关于mysql - 使用 SUM 计算多个表中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7537381/

相关文章:

Windows 8.1 Pro 64 位上的 MySQL 5.6.14 64 位连接问题

python - 在postgresql中插入一个数组

c++ - sql Column with multiple values(cpp文件中的查询实现)

mysql 对单个表中的多组数据求和

mysql - 是否有可能加快 MySQL 中的 sum() 速度?

mysql - 在Mysql中,为什么未使用的索引会影响查询计划?

mysql - 如何使用 vb.net 找到 mysql 数据库中每个 machine_id 的最后一行?

c# - 无法连接到 MySQL

sql - Linux SQL 服务器 Windows SSMS 连接

mysql - 当表1中找到数据时更新表2