选择主表中的所有行并对多个详细信息表中的列求和

时间:2015-01-24 16:18:39

标签: sql sqlite

我有一个主表(项目列表)以及在一个公共字段(RecNum)上连接的几个子表。我需要按列列出所有子表的总计,我不知道该怎么做。这是表格设计的一个示例。每个表中有更多列(我需要从“项目列表”中提取*)但我正在显示列名称和值的示例,以了解要执行的操作。

Project List
| RecNum | Project Description |
|      6 | Sample description  |
|      7 | Another sample      |

WeekA
| RecNum | UserName | Day1Reg | Day1OT | Day2Reg | Day2OT | Day3Reg | Day3OT |
|      6 | JustMe   |       1 |      2 |       3 |      4 |       5 |      6 |
|      6 | NotMe    |       1 |      2 |       3 |      4 |       5 |      6 |
|      7 | JustMe   |         |        |         |        |         |        |
|      7 | NotMe    |         |        |         |        |         |        |

WeekB
| RecNum | UserName | Day1Reg | Day1OT | Day2Reg | Day2OT | Day3Reg | Day3OT |
|      6 | JustMe   |       7 |      8 |       1 |      2 |       3 |      4 |
|      6 | NotMe    |       7 |      8 |       1 |      2 |       3 |      4 |
|      7 | JustMe   |         |        |         |        |         |        |
|      7 | NotMe    |         |        |         |        |         |        |

因此,第一个查询应返回两个用户的完整总计,如下所示:

| RecNum | Project Description | sumReg | sumOT |
|      6 | Sample description  |     40 |    52 |
|      7 | Another sample      |      0 |     0 |

第二个查询应该返回指定用户的总数(WHERE UserName ='JustMe'),如下所示:

| RecNum | Project Description | sumReg | sumOT |
|      6 | Sample description  |     20 |    26 |
|      7 | Another sample      |      0 |     0 |

1 个答案:

答案 0 :(得分:2)

具有相同结构的多个并行表通常表明数据库设计不佳。数据应该全部在一个表中,其他列指定周。

但是,您可以使用union all将数据整合在一起。以下是查询的示例:

select pl.recNum, pl.ProjectDescription,
       sum(Day1Reg + Day2Reg + Day3Reg) as reg,
       sum(Day1OT + Day2OT + Day3OT) as ot
from ProjectList pl join
     (select * from weekA union all
      select * from weekB
     ) w
     on pl.recNum = w.recNum
group by l.recNum, pl.ProjectDescription,;

实际上,您应该将select *union all一起使用。您应该明确列出列。您可以添加适当的where子句或条件聚合,以获得您在任何特定情况下所需的结果。