2015-01-29 2 views
0

в базе данных, из которой выполняется запрос, из двух таблиц, один из них является живым, а один - архивом, однако мне нужны данные из обоих вместе, вот пример запрос у меня есть.Присоединение двух запросов SQL Server к одному

SELECT  SUM(SOPOrderReturnLine.LineTotalValue) AS Value, CONVERT(date, SOPOrderReturnLine.DateTimeCreated) 
        AS Date 
FROM   SOPOrderReturnLine AS SOPOrderReturnLine 
WHERE  (SOPOrderReturnLine.AnalysisCode1 LIKE 'angela%') AND (CONVERT(date, SOPOrderReturnLine.DateTimeCreated) > DATEADD(day, - 15, GETDATE())) 
GROUP BY CONVERT(date, SOPOrderReturnLine.DateTimeCreated) 
ORDER BY Date 

Этот запрос суммирует данные из живой таблицы, таблицы архива точно такая же strucute, как это, но называется SOPOrderReturnLineArch, что было бы лучшим способом объединения это на один запрос, поэтому для столбца значение будет представлять собой сумму обеих таблиц за эту дату, а не только SOPOrderReturnLine, как сейчас.

ответ

0

Использование UNION ALL объединить обе таблицы, а затем сделать все остальное, как и раньше:

SELECT  SUM(SOPOrderReturnLine.LineTotalValue) AS Value, CONVERT(date, SOPOrderReturnLine.DateTimeCreated) 
        AS Date 
FROM (SOPOrderReturnLine 
     UNION ALL 
     SOPOrderReturnLineArch 
    ) AS SOPOrderReturnLine 
WHERE  (SOPOrderReturnLine.AnalysisCode1 LIKE 'angela%') AND (CONVERT(date, SOPOrderReturnLine.DateTimeCreated) > DATEADD(day, - 15, GETDATE())) 
GROUP BY CONVERT(date, SOPOrderReturnLine.DateTimeCreated) 
ORDER BY Date 

Или сделать UNION ALL с двумя результатами:

SELECT  SUM(SOPOrderReturnLine.LineTotalValue) AS Value, CONVERT(date, SOPOrderReturnLine.DateTimeCreated) 
        AS Date 
FROM SOPOrderReturnLine 
WHERE  (SOPOrderReturnLine.AnalysisCode1 LIKE 'angela%') AND (CONVERT(date, SOPOrderReturnLine.DateTimeCreated) > DATEADD(day, - 15, GETDATE())) 
GROUP BY CONVERT(date, SOPOrderReturnLine.DateTimeCreated) 
UNION ALL 
SELECT  SUM(SOPOrderReturnLine.LineTotalValue) AS Value, CONVERT(date, SOPOrderReturnLine.DateTimeCreated) 
        AS Date 
FROM SOPOrderReturnLineArc AS SOPOrderReturnLine 
WHERE  (SOPOrderReturnLine.AnalysisCode1 LIKE 'angela%') AND (CONVERT(date, SOPOrderReturnLine.DateTimeCreated) > DATEADD(day, - 15, GETDATE())) 
GROUP BY CONVERT(date, SOPOrderReturnLine.DateTimeCreated) 
ORDER BY Date 
+0

Использование этих двух строк для каждой даты, если бы я хотел добавить значение для каждой даты вместе, как я могу это сделать? 400,00 \t 2015-01-15 1145,99 \t 2015-01-15 1498,64 \t 2015-01-16 764,50 \t 2015-01-19 288,11 \t 2015-01-19 это часть результата поэтому для 15-го я хочу добавить их вместе и так далее, если есть несколько строк в день –

+0

Я не ожидал появления одинаковых дат в обеих таблицах ... – jarlh

+0

Да, таблицы имеют ту же структуру –

0

Совокупные результаты в каждой таблице используйте union all, чтобы собрать их вместе, а затем повторно агрегат:

SELECT date, SUM(VALUE) as total_value 
FROM ((SELECT CONVERT(date, orl.DateTimeCreated) as date, 
       SUM(orl.LineTotalValue) AS Value 
     FROM SOPOrderReturnLine AS orl 
     WHERE orl.AnalysisCode1 LIKE 'angela%') AND 
      (CONVERT(date, orl.DateTimeCreated) > DATEADD(day, - 15, GETDATE())) 
     GROUP BY CONVERT(date, orl.DateTimeCreated) 
    ) UNION ALL 
     (SELECT CONVERT(date, orl.DateTimeCreated) as date, 
       SUM(orl.LineTotalValue) AS Value 
     FROM SOPOrderReturnLine_archive AS orl 
     WHERE orl.AnalysisCode1 LIKE 'angela%') AND 
      (CONVERT(date, orl.DateTimeCreated) > DATEADD(day, - 15, GETDATE())) 
     GROUP BY CONVERT(date, orl.DateTimeCreated) 
    ) 
    ) x 
GROUP BY date 
ORDER BY Date; 

Doing агрегация до union all предоставляет SQL Server больше возможностей для оптимизации. Это не всегда быстрее, чем выполнение агрегации только после union all, но это может быть так.

+0

Когда i ' m i запускать это, я получаю эту ошибку Msg 8120, уровень 16, состояние 1, строка 2 Столбец SOPOrderReturnLine.DateTimeCreated недействителен в списке выбора becau se он не содержится ни в агрегатной функции, ни в предложении GROUP BY. –