【SQL练习】请用SQL 语句实现:从数据表Test中查询出所有月份的发生额都比101 科目相应月份的发生额高的科目。

请用SQL 语句实现:从数据表Test中查询出所有月份的发生额都比101 科目相应月份的发生额高的科目。说明:表Test 中有很多科目,都有1~12 月份的发生额,
有3个字段:
accid 科目代码
occmonth 发生额月份
debitoccur:发生额

根据问题描述,需要找出所有科目,其每个月份的发生额都比101科目相应月份的发生额高。以下是SQL实现:

SELECT t1.accid
FROM Test t1
WHERE t1.accid <> '101'  -- 排除101科目自身
AND NOT EXISTS (
    -- 检查是否存在某个月份,该科目的发生额不大于101科目的发生额
    SELECT 1
    FROM Test t2
    WHERE t2.accid = '101'
    AND t2.occmonth = t1.occmonth
    AND t2.debitoccur >= t1.debitoccur
)
GROUP BY t1.accid
HAVING COUNT(DISTINCT t1.occmonth) = 12  -- 确保该科目有完整的12个月数据

解释说明:

  1. 主查询:选择所有不是101的科目
  2. NOT EXISTS子查询:这是关键部分,确保对于该科目的每个月份,都不存在101科目在该月份的发生额大于或等于该科目的情况
  3. GROUP BY和HAVING:确保科目有完整的12个月数据(如果数据可能不完整)
  4. 逻辑:如果一个科目在所有12个月份中,每个月的发生额都严格大于101科目对应月份的发生额,那么它就会被选中

注意事项:

  • 假设科目代码是字符串类型,所以使用'101'
  • 如果数据可能缺少某些月份,HAVING子句确保只考虑有完整12个月数据的科目
  • 如果需要考虑可能存在NULL值的情况,可以添加适当的NULL处理

替代写法(使用ALL关键字):

SELECT accid
FROM Test t
WHERE accid <> '101'
AND debitoccur > ALL (
    SELECT debitoccur
    FROM Test 
    WHERE accid = '101' 
    AND occmonth = t.occmonth
)
GROUP BY accid
HAVING COUNT(DISTINCT occmonth) = 12

两种写法在逻辑上是等价的,都可以实现所需的功能。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值