使用 WHERE 子句连接多个表
JOIN multiple tables with WHERE clauses
我有一个主 table(项目列表)以及几个子 table,它们连接在一个公共字段 (RecNum) 上。我需要按列获取所有子 table 的总计,但我不确定该怎么做。这是 table 设计的示例。每个 table 中还有更多列,但我展示了列名称和值的示例,以了解要做什么。
项目清单
|记录号 |
| 6 |
周A
|记录号 |用户名 |第一天注册 |第 1 天 |第二天注册 |第 2 天 |第三天注册 |第 3 天 |
| 6 |就我| 1 | 2 | 3 | 4 | 5 | 6 |
| 6 |不是我 | 1 | 2 | 3 | 4 | 5 | 6 |
周B
|记录号 |用户名 |第一天注册 |第 1 天 |第二天注册 |第 2 天 |第三天注册 |第 3 天 |
| 6 |就我| 7 | 8 | 1 | 2 | 3 | 4 |
| 6 |不是我 | 7 | 8 | 1 | 2 | 3 | 4 |
所以第一个查询应该 return 两个用户的完整总数,如下所示:
| sumDay1Reg | sumDay1OT | sumDay2Reg | sumDay2OT | sumDay3Reg | sumDay3OT |
| 16 | 20 | 8 | 12 | 16 | 20 |
第二个查询应该 return 仅指定用户 (WHERE UserName = 'JustMe') 的总数,如下所示:
| sumDay1Reg | sumDay1OT | sumDay2Reg | sumDay2OT | sumDay3Reg | sumDay3OT |
| 8 | 10 | 4 | 6 | 8 | 10 |
SELECT
(SUM(a.Day1Reg + b.Day1Reg)) AS sumDay1Reg,
(SUM(a.Day1OT + b.Day1OT)) AS sumDay1OT,
(SUM(a.Day2Reg + b.Day2Reg)) AS sumDay2Reg,
(SUM(a.Day2OT + b.Day2OT)) AS sumDay2OT,
(SUM(a.Day3Reg + b.Day3Reg)) AS sumDay3Reg,
(SUM(a.Day3OT + b.Day3OT)) AS sumDay3OT
FROM WeekA a,
WeekB b
WHERE a.userName = 'JustMe' AND b.userName = 'JustMe' --Comment this out for first query
让多个 table 存储相同类型的数据是个坏主意;你应该有一个 Weeks
table 有一个额外的一周列。
无论如何,处理这个table结构最简单的方法是先组合table:
SELECT SUM(Day1Reg) AS sumDay1Reg,
SUM(Day10T) AS sumDay10T,
...
FROM (SELECT * FROM WeekA
UNION ALL
SELECT * FROM WeekB)
WHERE userName = 'JustMe' -- optional
我有一个主 table(项目列表)以及几个子 table,它们连接在一个公共字段 (RecNum) 上。我需要按列获取所有子 table 的总计,但我不确定该怎么做。这是 table 设计的示例。每个 table 中还有更多列,但我展示了列名称和值的示例,以了解要做什么。
项目清单 |记录号 | | 6 | 周A |记录号 |用户名 |第一天注册 |第 1 天 |第二天注册 |第 2 天 |第三天注册 |第 3 天 | | 6 |就我| 1 | 2 | 3 | 4 | 5 | 6 | | 6 |不是我 | 1 | 2 | 3 | 4 | 5 | 6 | 周B |记录号 |用户名 |第一天注册 |第 1 天 |第二天注册 |第 2 天 |第三天注册 |第 3 天 | | 6 |就我| 7 | 8 | 1 | 2 | 3 | 4 | | 6 |不是我 | 7 | 8 | 1 | 2 | 3 | 4 |
所以第一个查询应该 return 两个用户的完整总数,如下所示:
| sumDay1Reg | sumDay1OT | sumDay2Reg | sumDay2OT | sumDay3Reg | sumDay3OT | | 16 | 20 | 8 | 12 | 16 | 20 |
第二个查询应该 return 仅指定用户 (WHERE UserName = 'JustMe') 的总数,如下所示:
| sumDay1Reg | sumDay1OT | sumDay2Reg | sumDay2OT | sumDay3Reg | sumDay3OT | | 8 | 10 | 4 | 6 | 8 | 10 |
SELECT
(SUM(a.Day1Reg + b.Day1Reg)) AS sumDay1Reg,
(SUM(a.Day1OT + b.Day1OT)) AS sumDay1OT,
(SUM(a.Day2Reg + b.Day2Reg)) AS sumDay2Reg,
(SUM(a.Day2OT + b.Day2OT)) AS sumDay2OT,
(SUM(a.Day3Reg + b.Day3Reg)) AS sumDay3Reg,
(SUM(a.Day3OT + b.Day3OT)) AS sumDay3OT
FROM WeekA a,
WeekB b
WHERE a.userName = 'JustMe' AND b.userName = 'JustMe' --Comment this out for first query
让多个 table 存储相同类型的数据是个坏主意;你应该有一个 Weeks
table 有一个额外的一周列。
无论如何,处理这个table结构最简单的方法是先组合table:
SELECT SUM(Day1Reg) AS sumDay1Reg,
SUM(Day10T) AS sumDay10T,
...
FROM (SELECT * FROM WeekA
UNION ALL
SELECT * FROM WeekB)
WHERE userName = 'JustMe' -- optional