【问题标题】:The same result using sum and case when使用 sum 和 case 时的结果相同
【发布时间】:2021-11-13 19:36:42
【问题描述】:

我有以下查询,但它产生相同的结果,结果应该不同

select 
COALESCE(Clinic,'total') as Clinic,
sum(Revenue/ND) as Revenue_ND,
sum(Revenue/Home_Care) as Revenue_Home_Care
from
(
   select
   businesses.label as Clinic,
   COUNT(CASE 
    WHEN appointment_types.name like '%initial%' and appointment_types.category IN (
        'National- Ex Phys- ND',
        'National- Physio -ND',
        'National- OT -ND',
        'National- Speech Pathology- ND',
        'SA/WA - Physiotherapy - ND',
        'SA/WA - Telehealth Physiotherapy - ND'
    ) then 1 ELSE 0 END) 
    as ND,
   COUNT(CASE 
    WHEN appointment_types.name like '%initial%' and appointment_types.category IN (
        'National- Zest',
        'National- OT -HCP',
        'National- Physio -HCP',
        'National- Physio -Remedy',
        'National-Physio-TUH',
        'National- Speech Pathology- HCP'
    ) then 1 ELSE 0 END)
    as Home_Care,
  sum(CASE 
    WHEN appointment_types.category is not null 
    then invoices.net_amount ELSE 0 END)
    as Revenue
FROM 
  individual_appointments
  INNER join appointment_types on
  appointment_types.id = individual_appointments.appointment_type_id
  inner join invoices on
  invoices.appointment_id = individual_appointments.id
  inner join businesses on
  businesses.id = individual_appointments.business_id
WHERE
  {{clinic}} 
  and {{date}}
group by 
  businesses.label
)x
group by 
  ROLLUP(Clinic);

结果:

 Clinic                   Revenue_ND             Revenue_Home_Care
 Marli                    51.33                    51.33
 Alexandria               94.21                    94.21
 total                    230.48                   230.48

它应该导致不同的列值。 你能告诉我错误在哪里以及正确的查询解决方案吗?

【问题讨论】:

    标签: sql sql-server count sum case


    【解决方案1】:

    问题的原始版本被标记为 MySQL。

    COUNT() 计算条件的非NULL 值的数量。在您的代码中,CASE 表达式返回10。而且这些都不是NULL

    对于这种类型的计数,MySQL 有一个方便的快捷方式,不需要条件逻辑。您可以将布尔值相加:

    SUM( appointment_types.name like '%initial%' and 
         appointment_types.category IN (
         'National- Ex Phys- ND',
         'National- Physio -ND',
         'National- OT -ND',
         'National- Speech Pathology- ND',
         'SA/WA - Physiotherapy - ND',
         'SA/WA - Telehealth Physiotherapy - ND'
        )) 
    

    编辑:

    在 SQL Server(和许多其他数据库)中,您需要一个显式的 CASE 表达式:

    SUM(CASE WHEN appointment_types.name like '%initial%' and 
                  appointment_types.category IN (
                  'National- Ex Phys- ND',
                  'National- Physio -ND',
                  'National- OT -ND',
                  'National- Speech Pathology- ND',
                  'SA/WA - Physiotherapy - ND',
                  'SA/WA - Telehealth Physiotherapy - ND'
                  )
             THEN 1 ELSE 0
        END) 
    

    【讨论】:

    • 不是 sum 来计算总值吧?我想计算包含单词“initial”并且在类别列中的字符数。然后我想将总收入除以类别列中包含“姓名缩写”一词的字符数相加。您的答案中 ')' 附近的语法不正确。
    • 我正在使用 sql server
    • 但在计算两者的收入时,结果应该不同时总是产生相同的值。 sum(Revenue/ND) as Revenue_ND, sum(Revenue/Home_Care) as Revenue_Home_Care 你能告诉我为什么结果总是一样的吗?错在哪里?
    • sum(CASEWHEN appointment_types.category is not nullthen invoices.net_amount ELSE 0 END)as Revenueor wrong in this query?
    • 如果我删除此查询或将其更改为显式sum(CASE WHEN appointment_types.category is not null then invoices.net_amount ELSE 0 END) as Revenue,结果仍将返回相同的值
    猜你喜欢
    • 2014-03-07
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多