请用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个月数据
解释说明:
- 主查询:选择所有不是101的科目
- NOT EXISTS子查询:这是关键部分,确保对于该科目的每个月份,都不存在101科目在该月份的发生额大于或等于该科目的情况
- GROUP BY和HAVING:确保科目有完整的12个月数据(如果数据可能不完整)
- 逻辑:如果一个科目在所有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
两种写法在逻辑上是等价的,都可以实现所需的功能。


被折叠的 条评论
为什么被折叠?



