从多个表生成结果表

时间:2011-08-15 18:01:56

标签: sql sql-server-2008-r2

SQL Server 2008 R2

我有3个表包含3种不同类型事件的数据

Type1,Type2,Type3有两列:

DatePoint ValuePoint

我想生成看起来像这样的结果表:

DatePoint TotalType1 TotalType2 TotalType3

我从那开始

SELECT [DatePoint]
      ,SUM(ValuePoint) as TotalType1 
  FROM [dbo].[Type1]
  GROUP BY [DatePoint]
  ORDER BY [DatePoint]

SELECT [DatePoint]
      ,SUM(ValuePoint) as TotalType2
  FROM [dbo].[Type2]
  GROUP BY [DatePoint]
  ORDER BY [DatePoint]

SELECT [DatePoint]
      ,SUM(ValuePoint) as TotalType3
  FROM [dbo].[Type3]
  GROUP BY [DatePoint]
  ORDER BY [DatePoint]

所以我有三个结果,但我需要生成一个(Date TotalType1 TotalType2 TotalType3),接下来我需要做什么来实现我的目标?

更新

忘记提及一种类型中存在的DatePoint可能存在,也可能不存在于另一种类型

3 个答案:

答案 0 :(得分:3)

这是我的看法。我假设你在每个表中都有相同的日期时间值(当然,我使用的东西永远不会那么一致)。应该有一种更简单的方法来做到这一点,但是一旦你过了两个外连接,事情就会变得非常棘手。

SELECT
   dp.DatePoint
  ,isnull(t1.TotalType1, 0) TotalType1
  ,isnull(t2.TotalType2, 0) TotalType2
  ,isnull(t3.TotalType3, 0) TotalType3
 from (--  Without "ALL", UNION will filter out duplicates
       select DatePoint
        from Type1
       union select DatePoint
        from Type2
       union select DatePoint
        from Type3) dp
  left outer join (select DatePoint, sum(ValuePoint) TotalType1
                    from Type1
                    group by DatePoint) t1
   on t1.DatePoint = db.DatePoint
  left outer join (select DatePoint, sum(ValuePoint) TotalType2
                    from Type2
                    group by DatePoint) t2
   on t2.DatePoint = db.DatePoint
  left outer join (select DatePoint, sum(ValuePoint) TotalType3
                    from Type3
                    group by DatePoint) t3
   on t3.DatePoint = db.DatePoint
 order by dp.DatePoint

答案 1 :(得分:1)

假设某些不同可能会有所帮助,但总体思路应如下:

SELECT
    t.[DatePoint],
    SUM(t1.ValuePoint) as TotalType1,
    SUM(t2.ValuePoint) as TotalType2,
    SUM(t3.ValuePoint) as TotalType3 
FROM
(
    SELECT [DatePoint] FROM [dbo].[Type1]
    UNION
    SELECT [DatePoint] FROM [dbo].[Type2]
    UNION
    SELECT [DatePoint] FROM [dbo].[Type3]
) as t

LEFT JOIN
    [dbo].[Type1] t1
ON
    t1.[DatePoint] = t.[DatePoint]
LEFT JOIN
    [dbo].[Type2] t2
ON
    t2.[DatePoint] = t.[DatePoint]
LEFT JOIN
    [dbo].[Type3] t3
ON
    t3.[DatePoint] = t.[DatePoint]
GROUP BY
    t.[DatePoint]
ORDER BY
    t.[DatePoint]

答案 2 :(得分:1)

要避免所有JOIN s:

SELECT
    SQ.DatePoint,
    SUM(CASE WHEN SQ.type = 1 THEN SQ.ValuePoint ELSE 0 END) AS TotalType1,
    SUM(CASE WHEN SQ.type = 2 THEN SQ.ValuePoint ELSE 0 END) AS TotalType2,
    SUM(CASE WHEN SQ.type = 3 THEN SQ.ValuePoint ELSE 0 END) AS TotalType3
FROM (
    SELECT
        1 AS type,
        DatePoint,
        ValuePoint
    FROM
        dbo.Type1
    UNION ALL
    SELECT
        2 AS type,
        DatePoint,
        ValuePoint
    FROM
        dbo.Type2
    UNION ALL
    SELECT
        3 AS type,
        DatePoint,
        ValuePoint
    FROM
        dbo.Type3
    ) AS SQ
GROUP BY
    DatePoint
ORDER BY
    DatePoint

从提供的少量信息来看,似乎数据库设计存在一些缺陷,这可能是查询数据非常困难的部分原因。