我有两个表,其中有一列名为 no_id,我想测试表上两列中的值是否相同。
所以我尝试对两列的值求和并比较结果。
SELECT
CASE
WHEN SUM (cast(a.no_id as bigint)) = SUM(cast(b.no_id as bigint)) THEN 'YES'
ELSE 'NO'
END as no_id
FROM table_a as a
,table_b as b
查询的结果是NO,但是当我选择每个总和时:
SELECT
SUM (cast(a.no_id as bigint)),
SUM(cast(b.no_id as bigint))
FROM table_a as a
,table_b as b
我有两个空值,每列一个。而不是列的总和。
我必须对两个表的其他二十列执行此操作。
两个表中的 no_id 都是 varchar(16)。
------更新------
no_id仅包含数字字符串, 我执行了下一个查询以确保 null 将被视为 0:
SELECT
SUM(cast(ISNULL(a.no_id,0) as bigint)),
SUM(cast(ISNULL(b.no_id,0) as bigint))
FROM table_a as a
,table_b as b
但我一直得到相同的结果。
如果我只从一个表中选择结果,它就会起作用,我会得到总和的结果:
SELECT
SUM(cast(ISNULL(a.no_id,0) as bigint))
FROM table_a as a
那么,为什么它不适用于两个表?
最佳答案
正如我在评论中所说:
- 不要在 FROM 子句中使用逗号(
,
) 运算符,它已经过时了二十多年,请改用 JOIN 关键字语法。因为如果你这样做了,你就会知道...... - 您是CROSS JOIN - 修改你的表格,这是非常糟糕的,并且 99% 的时间都是逻辑错误的。您需要改用列子查询。
像这样:
SELECT
CASE
WHEN (SELECT SUM(cast(no_id as bigint)) FROM table_a)
= (SELECT SUM(cast(no_id as bigint)) FROM table_b) THEN 'YES'
ELSE 'NO'
END as no_id
关于sql - 比较sql中两列的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21165998/