You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server中使用EXCEPT函数实现数值相减失败的问题

解决SQL Server中EXCEPT无法实现数值减法的问题

你误用了EXCEPT的功能——它是集合差集运算符,作用是返回第一个查询结果里存在、但第二个查询结果里没有的行,根本不是用来做数值减法的。你的两个查询针对同一个MeterServicePointNumber统计,只要两个结果的Generation数值不同,EXCEPT就会直接返回第一个查询的行,完全不会执行减法计算。

要实现"ChannelNumber='03'的统计值减去ChannelNumber='01'的统计值",推荐用以下两种方法:

方法一:条件聚合(推荐,效率更高)

通过CASE语句分别统计两个渠道的总和,直接在查询中完成减法:

SELECT 
  SUM(CASE WHEN ChannelNumber = '03' THEN IntervalUsageQuantity ELSE 0 END) 
  - SUM(CASE WHEN ChannelNumber = '01' THEN IntervalUsageQuantity ELSE 0 END) AS Generation,
  MeterServicePointNumber
FROM BillingCustomer.IntervalHourly
WHERE IntervalYear = '2024' 
  AND IntervalMonth = '10' 
  AND MeterServicePointNumber = '693834004-00002'
  AND ChannelNumber IN ('01', '03') -- 只过滤需要的渠道,减少计算量
GROUP BY MeterServicePointNumber

方法二:子查询直接相减

如果两个查询的过滤条件差异较大,可以用独立子查询分别计算后再相减:

SELECT 
  (SELECT SUM(IntervalUsageQuantity) 
   FROM BillingCustomer.IntervalHourly
   WHERE IntervalYear = '2024' 
     AND IntervalMonth = '10' 
     AND ChannelNumber = '03' 
     AND MeterServicePointNumber = '693834004-00002')
  -
  (SELECT SUM(IntervalUsageQuantity) 
   FROM BillingCustomer.IntervalHourly
   WHERE IntervalYear = '2024' 
     AND IntervalMonth = '10' 
     AND ChannelNumber = '01' 
     AND MeterServicePointNumber = '693834004-00002') AS Generation,
  '693834004-00002' AS MeterServicePointNumber

内容的提问来源于stack exchange,提问作者Aar684

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 01:18:17