首页 > 解决方案 > SQL Query 对单独查询的结果进行分类

问题描述

我正在尝试对单独查询的结果运行查询,以根据唯一的 Route_Code 和 Delivery_Day 更新每条记录的 Route_Type 列。对于选择查询中的每个不同的 Route_Code,Route_Type 应根据以下逻辑进行更新:

  1. 如果没有针对 Delivery_Day = 'Mon' 的特定 Route_Code 的记录,则 Route_Type 应更新为 'A'
  2. 如果没有 Delivery_Day = 'Sat' 的特定 Route_Code 的记录,则 Route_Type 应更新为 'B'
  3. 如果没有特定 Route_Code 的记录,其中 Delivery_Day = 'Mon' OR 'Sat',则 Route_Type 应为 'TBD'
  4. Else Route_Type = '两者。'

数据:

Record   Route_Code   Delivery_Day   Route_Type
1        112          Mon
2        112          Thur
3        112          Sat
4        112          Sun
5        113          Tue
6        113          Fri
7        113          Sat
8        113          Sun
9        113          Wed

选择查询:

Select Distinct Route_Code
From Deliveries;

结果:

     Route_Code
1    112
2    113

查询应返回所有唯一的 Route_Code 和每个计算的 Route_Type,如下所示...

期望的查询结果:

     Route_Code   Route_Type
1    112          Both
2    113          A

作为后续行动,我希望所有记录少于 1 个月的 Route_Code 都显示“待定”。到目前为止我的逻辑是

When
Max(sum(case when Delivery_Day= 'Mon' then 1 else 0 end),
    sum(case when Delivery_Day= 'Tue' then 1 else 0 end),
    sum(case when Delivery_Day= 'Wed' then 1 else 0 end),
    sum(case when Delivery_Day= 'Thu' then 1 else 0 end),
    sum(case when Delivery_Day= 'Fri' then 1 else 0 end),
    sum(case when Delivery_Day= 'Sat' then 1 else 0 end),
    sum(case when Delivery_Day= 'Sun' then 1 else 0 end)
Then 'TBD'

我意识到本机 Max() 函数只处理单个参数,并且想知道从这里去哪里。

标签: sqlsql-servertsql

解决方案


这听起来像聚合。我觉得你的逻辑有点难以理解。如果我理解正确,“B”有星期一交货,“A”有星期六。逻辑如下所示:

select route_code,
       (case when sum(case when Delivery_Day = 'Mon' then 1 else 0 end) > 0 and
                  sum(case when Delivery_Day = 'Sat' then 1 else 0 end) > 0 
             then 'Both'
             when sum(case when Delivery_Day = 'Mon' then 1 else 0 end) > 0 
             then 'B'
             when sum(case when Delivery_Day = 'Sat' then 1 else 0 end) > 0 
             then 'A'
             else 'TBD'
        end) as route_type       
from delivies
group by route_code

推荐阅读