sql - 比较sql中两列的总和

标签 sql sql-server t-sql

我有两个表,其中有一列名为 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

那么,为什么它不适用于两个表?

最佳答案

正如我在评论中所说:

  1. 不要在 FROM 子句中使用逗号(,) 运算符,它已经过时了二十多年,请改用 JOIN 关键字语法。因为如果你这样做了,你就会知道......
  2. 您是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/

相关文章:

sql-server - 按名称排序,也按键排序

sql - 别名后的括号

sql - 在jasperreport中传递SQL "IN"参数列表

php - 检索行数并在没有行时返回 0

sql-server - 从现有数据库进行 Azure 搜索

sql-server - 使用滚动小计和百分比进行查询

sql-server - 将 ISO 8601 持续时间转换为十进制时间 SQL 值,例如 PT7H30M 或 PT8H0M

javascript - knex 的选择出现意外行为

php - 多个表中的平均值的平均值

sql-server - Visual Studio DB 项目 : model already has an element that has the same name