Объединение результатов нескольких операторов SELECT с различными предложениями WHERE в один запрос - PullRequest
0 голосов
/ 02 октября 2019

У меня есть таблица, в которой есть столбец с 15 различными именами (TotalName), два из этих имен будут flowOne и flowTwo. Существует также столбец, который представляет собой метку времени (t_stamp) и значение. Каждый раз, когда новое значение добавляется в таблицу, оно помечается вместе с тем, откуда оно появилось. Я пытаюсь создать запрос, который даст мне столбцы для каждого из 15 различных имен вместе с итогом за месяц и номером месяца. Я попробовал это для двух имен, и они заканчиваются в отдельных рядах. Я хотел бы, чтобы он отображался в одной строке за месяц.

SELECT  YEAR(t_stamp) as 'Year', MONTH(t_stamp) as 'Month', sum(FlowTotals.FlowTotal) as 'flowOne', '' as 'flowTwo'
FROM DataBase.dbo.FlowTotals
WHERE FlowTotals.TotalName = 'flowOne'
    and year(t_stamp) = year(getDate())
Group By Year(t_stamp), Month(t_stamp)

UNION

SELECT  YEAR(t_stamp) as 'Year', MONTH(t_stamp) as 'Month', '' as 'flowOne', sum(FlowTotals.FlowTotal) as 'flowTwo'
FROM DataBase.dbo.FlowTotals
WHERE FlowTotals.TotalName = 'flowTwo'
    and year(t_stamp) = year(getDate())
Group By Year(t_stamp), Month(t_stamp)

Порядок по месяцам

Это выдаст

Year   Month   totalOne   totalTwo
2019     1     123456     0
2019     1     0          789123
2019     2     456789     0
2019     2     0          345678

Я бы хотелиметь одну строку для месяца 1, одну строку для месяца 2 со всеми значениями в этой строке и т. д.

Я знаю, что часть проблемы заключается в том, что в моих операторах Select есть '' as 'flowOne, но это был единственныйТаким образом, я мог бы разделить на 2 разных столбца. Суммирование для каждой строки работает как ожидалось.

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Простой способ и мало что изменивший в вашем запросе - заключить ваш выбор в cte, а затем использовать этот cte для group by year и month и получить sum(FlowOne) и sum(FlowTwo), напримерthis (я заменил пустые строки на 0, чтобы сумма работала, так как они оба будут числами. Приведение состоит в том, чтобы просто предотвратить внутреннее преобразование SQL в бит вместо int:

with cte as(
SELECT  YEAR(t_stamp) as 'Year', MONTH(t_stamp) as 'Month', sum(FlowTotals.FlowTotal) as 'flowOne', cast(0 as int) as 'flowTwo'
FROM DataBase.dbo.FlowTotals
WHERE FlowTotals.TotalName = 'flowOne'
    and year(t_stamp) = year(getDate())
Group By Year(t_stamp), Month(t_stamp)
UNION
SELECT  YEAR(t_stamp) as 'Year', MONTH(t_stamp) as 'Month', cast(0 as int) as 'flowOne', sum(FlowTotals.FlowTotal) as 'flowTwo'
FROM DataBase.dbo.FlowTotals
WHERE FlowTotals.TotalName = 'flowTwo'
  and year(t_stamp) = year(getDate())
Group By Year(t_stamp), Month(t_stamp)
)
select c.Year, c.Month, sum(c.FlowOne), sum(c.FlowTwo)
from cte as c
group by c.Year, c.Month
0 голосов
/ 02 октября 2019

Вместо union ваших двух запросов, join их на q1.year = q2.year and q1.month = q2.month.

...