Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 多表父子关系的公共列求和第2部分_Sql_Sql Server - Fatal编程技术网

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
;