Sql 组合查询以显示一组结果

Sql 组合查询以显示一组结果,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有两个单独的查询,需要根据日期值进行匹配和组合 select convert(varchar,Delivery_Date,101) as 'Date', sum(case when billing_group = '3' and delivery_date >= dateadd(day,datediff(day, 0, GetDate()) - 30, 0) then 1 else 0 end) as 'OR to WA' from orders where deliv

我有两个单独的查询,需要根据日期值进行匹配和组合

select convert(varchar,Delivery_Date,101) as 'Date',
sum(case when billing_group = '3' and delivery_date >= dateadd(day,datediff(day, 0, GetDate()) - 30, 0) then 1 else 0 end) as 'OR to WA'
    from orders 
    where delivery_Date >= dateadd(day, datediff(day, 0, GetDate()) - 30, 0) and billing_group in ('3') 
    group by delivery_date
    order by date desc


select convert(varchar,Origin_Date,101) as 'Date',
sum(case when billing_group = '4' and origin_date >= dateadd(day, datediff(day, 0, GetDate()) - 30, 0)then 1 else 0 end) as 'WA to OR'
        from orders 
        where origin_Date >= dateadd(day, datediff(day, 0, GetDate()) - 30, 0) and billing_group in ('4') 
        group by origin_Date
        order by date desc

请注意,我在第一个查询中使用了不同的日期值(交货日期),在第二个查询中使用了不同的日期值(原产地日期)


谢谢你的帮助

尝试使用UNION并添加缺少的列 然后进行分组和排序

select * from (
 convert(varchar,Delivery_Date,101) as 'Date',
sum(case when billing_group = '3' and delivery_date >= dateadd(day,datediff(day, 0, GetDate()) - 30, 0) then 1 else 0 end) as 'OR to WA',
0 as 'WA to OR'
    from orders 
    where delivery_Date >= dateadd(day, datediff(day, 0, GetDate()) - 30, 0) and billing_group in ('3') 
   -- group by delivery_date
   --- order by date desc

UNION

select convert(varchar,Origin_Date,101) as 'Date',
0 as 'OR to WA'
sum(case when billing_group = '4' and origin_date >= dateadd(day, datediff(day, 0, GetDate()) - 30, 0)then 1 else 0 end) as 'WA to OR'
        from orders 
        where origin_Date >= dateadd(day, datediff(day, 0, GetDate()) - 30, 0) and billing_group in ('4') 
        --group by origin_Date
        --order by date desc

        ) group by [Date] 
        order by [Date] desc

我认为您只需要条件聚合,但您的查询提供了其他改进空间:

select convert(varchar(255), v.thedate, 101) as [Date],
       sum(case when o.billing_group = 3 then 1 else 0 end) as [OR to WA],
       sum(case when o.billing_group = 4 then 1 else 0 end) as [WA to OR]
from orders o cross apply
     (values (case when o.billing_group = 3 then delivery_date else o.origin_date end)
     ) v(the_date)
where v.thedate >= dateadd(day, -30, cast(getdate() as date)) and
      o.billing_group in (3, 4) 
group by convert(varchar(255), v.thedate, 101)
order by v.thedate desc
注:

  • 切勿在没有长度参数的情况下使用
    varchar()
    。长度因上下文而异,可能无法达到预期效果
  • 我猜,
    billing\u group
    是一个数字。如果是这样,不要使用单引号。如果我错了,一定要用单引号
  • 我不知道
    交货日期
    的数据类型是什么。通过完整表达式进行聚合比仅通过列进行聚合更安全
  • 不要对列别名使用单引号。仅对字符串和日期常量使用单引号
  • 没有理由使用在
    0
    中添加天数的“技巧”来删除时间组件。相反,只需转换为
    date
  • delivery\u date
    的条件不必出现在
    case
    表达式和
    where
    子句中

将为每个日期提供两行,您需要在外部查询中进行第二次聚合。非常感谢!我会给它一个快照,一个查询是按OriginDate过滤和分组的,另一个是按DeliveryDate过滤和分组的。一开始我也没有注意到。@MatBailie。谢谢。WHERE子句还需要引用APPLY的输出,这将(我期望)给乐观主义者带来噩梦?对此感到抱歉-我以为我在最初的问题中写了一个注释-显然我没有。谢谢大家的关注!有人提出了一个解决方案——而且效果很好!当我试图对此发表评论时,帖子消失了。非常感谢!如果它是我写的,它就被删除了,因为它错了。我按相同的日期列对所有内容进行分组,但在每个查询中按不同的日期进行分组。这正是我想要的。我需要把所有事情都建立在一个日期的基础上(但对于一组订单来说,它是交货日期,对于下一个设定的提货日期)。我的时间安排一定很完美,因为你的解决方案很到位。谢谢马特贝利。