Sql 多表父子关系的公共列求和第2部分
这是一个直接的后续行动 表布局为:Sql 多表父子关系的公共列求和第2部分,sql,sql-server,Sql,Sql Server,这是一个直接的后续行动 表布局为: CREATE TABLE [dbo].[a] [primary_key] [nvarchar](7) NOT NULL CREATE TABLE [dbo].[b] [column1] [nvarchar](7) NOT NULL [column2] [int] NOT NULL [column3] [int] not null CREATE TABLE [dbo].[c] [column1] [nvarchar](7) NOT NULL [colu
CREATE TABLE [dbo].[a]
[primary_key] [nvarchar](7) NOT NULL
CREATE TABLE [dbo].[b]
[column1] [nvarchar](7) NOT NULL
[column2] [int] NOT NULL
[column3] [int] not null
CREATE TABLE [dbo].[c]
[column1] [nvarchar](7) NOT NULL
[column2] [int] NOT NULL
[column3] [int] not null
CREATE TABLE [dbo].[d]
[column1] [nvarchar](7) NOT NULL
[column2] [int] NOT NULL
[column3] [int] not null
CREATE TABLE [dbo].[DateTable]
[index] [int] NOT NULL
[date] [date] NOT NULL
这大致就是设计。在上一个查询中,我有1个父项和3个子项,我使用这个sql查询对3行进行求和
SELECT a.primary_key,
b.Sum AS Expr1,
c.Sum AS Expr2,
d.Sum AS Expr3,
ISNULL(b.Sum, 0) + ISNULL(c.Sum, 0) + ISNULL(d.Sum, 0) as [GrandTotal]
FROM dbo.Agency_Table a
OUTER APPLY (SELECT SUM(ISNULL(b.column2, 0)) [Sum] FROM dbo.b WHERE a.primary_key = b.column1) as b
OUTER APPLY (SELECT SUM(ISNULL(c.column2, 0)) [Sum] FROM dbo.c WHERE a.primary_key = c.column1) as c
OUTER APPLY (SELECT SUM(ISNULL(d.column2, 0)) [Sum] FROM dbo.d WHERE a.primary_key = d.column1 as d
现在我想实现的是使用b、c和d的第3列,这是一个int字段,链接到日期表E。我想按日期分组。这可以通过在int上分组来完成,但最好按实际日期分组。因此,有效地将数据库想象成一个不相关的妈妈和爸爸表,然后是它的3个孩子
我的设想是这样的
SELECT a.primary_key,
b.Sum AS Expr1,
c.Sum AS Expr2,
d.Sum AS Expr3,
dbo.dateTable.Date
ISNULL(b.Sum, 0) + ISNULL(c.Sum, 0) + ISNULL(d.Sum, 0) as [GrandTotal]
FROM dbo.Agency_Table a
OUTER APPLY (SELECT SUM(ISNULL(b.column2, 0)) [Sum] FROM dbo.b WHERE a.primary_key = b.column1) as b
OUTER APPLY (SELECT SUM(ISNULL(c.column2, 0)) [Sum] FROM dbo.c WHERE a.primary_key = c.column1) as c
OUTER APPLY (SELECT SUM(ISNULL(d.column2, 0)) [Sum] FROM dbo.d WHERE a.primary_key = d.column1 as d
//some kind of join to the next table
INNER JOIN dbo.b ON dbo.Date.index = dbo.b.Column3
INNER JOIN dbo.c ON dbo.Date.index = dbo.c.column3
INNER JOIN dbo.d ON dbo.Date.index = dbo.d.column3
group by dbo.dateTable.Date?
对不起,我想让你做我的工作
这是针对sql server 2012的。我发现,通过将where子句更改为包含日期筛选器,我可以灵活地对它们进行分组您可以将b、c和d与UNION运算符组合,并在一列中添加标识源表的内容:
SELECT column1, column2, column3, 1 AS Src FROM dbo.b
UNION ALL
SELECT column1, column2, column3, 2 AS Src FROM dbo.c
UNION ALL
SELECT column1, column2, column3, 3 AS Src FROM dbo.d
…将组合集连接到日期的相关子集:
…然后将结果连接到:
现在,您可以按.primary_键进行分组,为了获得每个子表的单独聚合结果,您可以使用CASE进行条件聚合:
SELECT
a.primary_key,
Expr1 = SUM(CASE s.Src WHEN 1 THEN s.column2),
Expr2 = SUM(CASE s.Src WHEN 2 THEN s.column2),
Expr3 = SUM(CASE s.Src WHEN 3 THEN s.column2),
GrandTotal = SUM(s.column2)
FROM
(
SELECT column1, column2, column3, 1 AS Src FROM dbo.b
UNION ALL
SELECT column1, column2, column3, 2 AS Src FROM dbo.c
UNION ALL
SELECT column1, column2, column3, 3 AS Src FROM dbo.d
) AS s
INNER JOIN
dbo.Dates AS d ON s.column3 = d.DateRef AND d.DateValue = ...
RIGHT JOIN
dbo.a AS a ON s.column1 = a.primary_key
GROUP BY
a.primary_key
;
提示:我们中的一些人可以比诗歌更容易地阅读TSQL语句,例如创建表格。这将是一个更好的方式来描述您的表和它们的关系。我确实写了一些好诗…根据要求修改
(
SELECT column1, column2, column3, 1 AS Src FROM dbo.b
UNION ALL
SELECT column1, column2, column3, 2 AS Src FROM dbo.c
UNION ALL
SELECT column1, column2, column3, 3 AS Src FROM dbo.d
) AS s
INNER JOIN
dbo.Dates AS d ON s.column3 = d.DateRef AND d.DateValue = ...
RIGHT JOIN
dbo.a AS a ON s.column1 = a.primary_key
SELECT
a.primary_key,
Expr1 = SUM(CASE s.Src WHEN 1 THEN s.column2),
Expr2 = SUM(CASE s.Src WHEN 2 THEN s.column2),
Expr3 = SUM(CASE s.Src WHEN 3 THEN s.column2),
GrandTotal = SUM(s.column2)
FROM
(
SELECT column1, column2, column3, 1 AS Src FROM dbo.b
UNION ALL
SELECT column1, column2, column3, 2 AS Src FROM dbo.c
UNION ALL
SELECT column1, column2, column3, 3 AS Src FROM dbo.d
) AS s
INNER JOIN
dbo.Dates AS d ON s.column3 = d.DateRef AND d.DateValue = ...
RIGHT JOIN
dbo.a AS a ON s.column1 = a.primary_key
GROUP BY
a.primary_key
;