使用基于字段值的日期

时间:2018-10-30 17:18:33

标签: sql sql-server tsql

我需要找到一种方法来关联两组订单。本质上是报表的入站与出站分析。负载平衡,以查看何时需要组织更多的取件或交付。

当billing_group = 3时,我需要提取交货日期 当billing_group = 4时,我需要拉出origin_date

希望这很有道理。谢谢大家!

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

Results I am looking for

是否可以将这两个单独的查询合并为一个以提供以下各列?日期,从OR到WA,以及从WA到OR(如上例所示),其中使用了日期(无论使用起源还是交货日期)

    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()) - 20, 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()) - 20, 0) and billing_group in ('4') 
    group by origin_Date
    order by date desc

1 个答案:

答案 0 :(得分:0)

我认为您需要按convert(varchar,Delivery_Date,101)而不是date进行分组。

使用聚合函数时,您需要在group by中添加非聚合列。

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

编辑

我看到您编辑了问题,可以尝试使用UNION ALL

SELECT * FROM (
    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()) - 20, 0) and billing_group in ('3') 
    group by delivery_date
    UNION ALL
    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()) - 20, 0) and billing_group in ('4') 
    group by origin_Date
) t1
ORDER BY Date desc