Создать таблицу результатов из нескольких таблиц - PullRequest
1 голос
/ 15 августа 2011

SQL Server 2008 R2

У меня есть 3 таблицы, содержащие данные для 3 различных типов событий

Тип1, Тип2, Тип3 с двумя столбцами:

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), что мне нужно сделать, чтобы достичь своей цели в следующий раз?

UPDATE

Забыл упомянуть, что DatePoint, который существует в одном типе, может существовать или не существовать в другом

Ответы [ 3 ]

3 голосов
/ 15 августа 2011

Вот мой дубль. Я предполагаю, что у вас нет одинаковые значения даты и времени в каждой таблице (конечно, вещи, с которыми я работаю, никогда не бывают настолько последовательными). Должен быть более простой способ сделать это, но как только вы пройдете два внешних соединения, все может стать довольно сложно.

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 голос
/ 15 августа 2011

Чтобы избежать всех 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

Из небольшой предоставленной информации, похоже, есть некоторые недостатки в дизайне базы данных, что, вероятно, является одной из причин того, чтоданные настолько сложны.

1 голос
/ 15 августа 2011

Предположим, что некоторые отличия могут помочь, но общая идея должна быть следующей:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...