【问题标题】:Combining results from multiple SELECT statements with different WHERE clauses into one query将具有不同 WHERE 子句的多个 SELECT 语句的结果组合到一个查询中
【发布时间】:2019-10-01 22:17:42
【问题描述】:

我有一个表,其中有一列有 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 个不同列的唯一方法。每行的求和都按预期工作。

【问题讨论】:

  • 请提供一些示例数据和预期输出。看起来你不需要 UNION,使用 GROUP BY Year, Month 和 PIVOT

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


【解决方案1】:

一个简单的方法并且对您的查询几乎没有改变,将您的选择包装为一个 cte,然后使用这个 cte 到 group by year 和 month 并获得 sum(FlowOne) 和 sum(FlowTwo),比如这个(我用 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-12-30
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多