【问题标题】:Multiple Sums with different where clauses in same query result set同一查询结果集中具有不同 where 子句的多个 Sums
【发布时间】:2013-12-30 02:29:15
【问题描述】:

我有几个表,我将它们连接在一起并从中选择各种列和总和,我想组合选择语句,以便所有结果都在同一个结果集中。 我目前有一个类似的查询:

declare @year INT
declare @month INT
set @year = '2013'
set @month = '08'

select CAST(LEFT(b.name, 3) AS varchar(3))AS Region, a.model, sum(a.Number)AS Uniques
from Table1 a
inner join database2.....table2 b
on a.code = b.code
where Year(a.EventDate) = @year
and Month(a.EventDate) = @month
and a.make='Toyota'
group by CAST(LEFT(b.name, 3) AS varchar(3)), a.model
order by CAST(LEFT(b.name, 3) AS varchar(3))

这会产生一个看起来像这样的数据集:

Region   Model    Uniques
EST      Toyota      200
EST      Honda       350
CEN      Toyota      220
CEN       VW         150

然后我有另一个类似的查询,但它使用不同的表和要求:

select CAST(LEFT(c.name, 3) AS varchar(3)) AS Region, a.Model, sum(b.Number)As Sales
from Table1 a
left join Table3 b
on a.leadid = b.leadid
inner join Database1..Table2 c
on a.code = c.code
where Year(a.EventDate) = @year
and Month(a.EventDate) = @month
and a.make='Toyota'
group by a.Model, CAST(LEFT(c.Name, 3) AS varchar(3))
order by CAST(LEFT(c.Name, 3) AS varchar(3))

这带来了类似的结果集:

 Region      Model       Sales
    EST      Toyota      150
    CEN       VW         80
    CEN      Toyota      75

我只想将这些结果配对或进行联合查询,以便获得类似的结果;

Region    Model       Uniques    Sales
EST       Toyota      200         150
EST       Honda       350          0
CEN       Toyota      220         75
CEN       vW          150         80

总共可能存在 20-30 个 Region/Model 组合,并且对于每个结果集都是相同的。

【问题讨论】:

    标签: sql sql-server select inner-join


    【解决方案1】:

    使用这个概念:

    SUM ( CASE WHEN ConditionIsMet THEN Column1 ELSE 0 END ),
    SUM ( CASE WHEN OtherCondIsMet THEN Column2 ELSE 0 END )
    

    【讨论】:

      【解决方案2】:

      好吧,如果您不能在一个查询中完成所有操作,那么您可以简单地将 2 个查询连接在一起:

      select
      t1.region,
      t1.model,
      t1.uniques,
      t2.sales
      from
      (select CAST(LEFT(b.name, 3) AS varchar(3))AS Region, a.model, sum(a.Number)AS Uniques
      from Table1 a
      inner join database2.....table2 b
      on a.code = b.code
      where Year(a.EventDate) = @year
      and Month(a.EventDate) = @month
      and a.make='Toyota'
      group by CAST(LEFT(b.name, 3) AS varchar(3)), a.model
      order by CAST(LEFT(b.name, 3) AS varchar(3))
      ) t1 
      inner join
      (
      select CAST(LEFT(c.name, 3) AS varchar(3)) AS Region, a.Model, sum(b.Number)As Sales
      from Table1 a
      left join Table3 b
      on a.leadid = b.leadid
      inner join Database1..Table2 c
      on a.code = c.code
      where Year(a.EventDate) = @year
      and Month(a.EventDate) = @month
      and a.make='Toyota'
      group by a.Model, CAST(LEFT(c.Name, 3) AS varchar(3))
      order by CAST(LEFT(c.Name, 3) AS varchar(3))
      ) t2
      on t1.region = t2.region 
      and t1.model = t2.model
      

      【讨论】:

      • 感谢这个答案完美。我这样做了,然后从原始查询中取出 ORDER BY 并得到我的结果集。
      • +1,但可能需要 FULL JOIN 和 NULL 处理才能从两个子查询中获取所有结果
      • 是的,我只是做了左外连接而不是内连接,然后在我的选择语句中是:SELECT t1.region, t1.model, t1.uniques, isnull(t2.sales,0) AS sales
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多