想要使用case when语句返回空行

时间:2018-10-17 15:09:26

标签: sql

假设我使用2种情况,当when语句将数据分组时,如下面的示例所示:

select case 
    when group1 = 'A' then 'Large'
    when group1 = 'B' then 'Medium'
    else 'Small' 
end as 'Order Size'
,case 
    when method = 'Delivery' then 'Delivery'
    else 'Pick-up' 
end as 'Distribution Method'
,count(distinct(OrderIDs)) 
from OrderTable
GROUP BY 
select case 
    when group1 = 'A' then 'Large'
    when group1 = 'B' then 'Medium'
    else 'Small' 
end
,case 
    when method = 'Delivery' then 'Delivery'
    else 'Pick-up' 
end

我们还要说,没有“大件”交货是“提货”。目前,该查询不会返回具有大件,提货类别的行。

如果没有符合条件的多重情况的行,是否有办法让行返回0?

2 个答案:

答案 0 :(得分:0)

使用cross join生成行,使用left join引入数据:

select os.OrderSize, coalesce(d.DistributionMethod, 'Pick-Up') as 
        count(*)
from (select 'Large' as OrderSize union all
      select 'Medium' as OrderSize union all
      select 'Small' as OrderSize
     ) os cross join
     (select 'Delivery' as DistributionMethod union all
      select 'Pick-Up' as DistributionMethod
    ) d left join
    OrderTable ot
    on ( (ot.group1 = 'A' and os.OrderSize = 'Large') or
         (ot.group1 = 'B' and os.OrderSize = 'Medium') or
         (ot.group1 not in ('A', 'B') and os.OrderSize = 'Small') 
       ) and
       ot.method = d.DistributionMethod     
group by os.OrderSize, coalesce(d.DistributionMethod, 'Pick-Up');

并非所有数据库都支持使用这种语法创建常量表,但是通常有一些语法可以做到这一点。

答案 1 :(得分:0)

您可以选择一个包含必需值的记录集,然后从此处离开对已分组记录集的联接。以下是SQL Server的示例,您可以在其中将结果联接到[Groupings].[OrderSize][Groupings].[DistributionMethod]

SELECT *
FROM (
    SELECT *
    FROM (
        SELECT 'Large' AS [OrderSize]
        UNION
        SELECT 'Medium' AS [OrderSize]
        UNION
        SELECT 'Small' AS [OrderSize]
    )     AS [OrderSizes]
        CROSS JOIN (
            SELECT 'Delivery' AS [DistributionMethod]
            UNION
            SELECT 'Pick-up' AS [DistributionMethod]
        ) AS [DistributionMethods]
) AS [Groupings]
    LEFT JOIN ...