将多个具有不同WHERE子句的SELECT语句的结果组合到一个查询中

时间:2019-10-01 22:17:42

标签: sql-server sql-server-2008 sql-server-2008-r2

我有一个表,该表的列中有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语句中的'flowOne',但是那是我想到的分成两列的唯一方法。每行的求和工作正常。

2 个答案:

答案 0 :(得分:0)

代替您的两个查询中的union,而在joinq1.year = q2.year and q1.month = q2.month

答案 1 :(得分:0)

一种简单的方法并且对查询的更改很少,只需将您的选择包装为cte,然后将此cte分别用于group by yearmonth并获得{{1 }}和sum(FlowOne),就像这样(我用0替换了空字符串,所以总和可以正常工作,因为它们都将是数字。强制转换只是为了防止SQL在内部将其转换为bit而不是int:

sum(FlowTwo)