繁体   English   中英

比较 SQL 中的两列

[英]Compare two columns in SQL

我是 SQL 新手,在 GCP 中有非常基本的查询。

让我们考虑下表:

姓名 C
阿伦 1234-5678 1234
塔拉 6789 - 7654 6789
阿伦 4567 4324

在这里,我想比较 B 列和 C 列,如果它们匹配,则在same的列中给出 1 else 0,否则在different的列中给出(我们必须创建)。

所以这里的问题:

  • 如果B列有1234-5678并且C列有1234 ,则该列应仅考虑值中“-”之前的数字匹配。

输出应该是:

姓名 C 相同的 不同的
阿伦 1234-5678 1234 1 0
塔拉 6789 - 7654 6789 1 0
阿伦 4567 4324 0 1

另外,我想为samedifferent列的Name中的每个值计算 1 的值。

到目前为止,我已经尝试过:

SELECT 
    name,
    b, 
    c , 
    if(b = c, 1, 0) as same, 
    if (b!=c,1,0) as different, 
    count(same), 
    count(different)
From Table

使用“MySQL” (与 SQL 服务器几乎相同)这是可能的解决方案。

步骤 1) 设置表

CREATE TABLE Users (
    Name varchar(50),
    B varchar(50),
    C varchar(50)
);

INSERT INTO Users
VALUES
('Arun', '1234-5678', '1234'),
('Tara', '6789-7654', '6789'),
('Arun', '4567', '4324');

用户列表

步骤 2) samedifferent

SELECT
    Name, B, C,
    CASE WHEN SUBSTRING_INDEX(B, "-", 1) = C THEN 1 ELSE 0 END as same,
    CASE WHEN SUBSTRING_INDEX(B, "-", 1) <> C THEN 1 ELSE 0 END as different
FROM
    Users

smae & 不同的查询结果

步骤 3) 加入两个结果以获得每个用户的total_sametotal_different

SELECT
    Name,
    SUM(CASE WHEN SUBSTRING_INDEX(B, "-", 1) = C THEN 1 ELSE 0 END) as total_same,
    SUM(CASE WHEN SUBSTRING_INDEX(B, "-", 1) <> C THEN 1 ELSE 0 END) as total_different
FROM
    Users
GROUP BY Name

每个用户的总相同和不同

参考: SQL 小提琴

第一步,您需要对列 b 进行SUBSTR 我们从位置 1 开始,我们想要 4 个字符(仅当 '-' 之前只有 4 个字符时才有效)。

With table2 as (
  select name, b,c, same, different from (select name, b, c, case when (SUBSTR(b,1,4) = c)
  then '1' else '0' end as same, case when(SUBSTR(b,1,4)!= c) then '1' else '0' end as different
from Table1
group by name, b,c))

当您有复杂的查询时,可以使用 WITH 子句,并且如果您想创建一个临时表以便之后使用它。

Table2 给你这个:

输出表2

在 WITH 子句之后,您将进行第二步,每个名称的相同/不同计数:

Select table1.name,count(table2.same+table2.different) as total from table1 
join table2 on (table2.name = table1.name and table2.b = table1.b)
group by table1.name;

输出为您提供每个名称的总数(名称是分组依据,因此在您的示例中,您将只有 2 行,一个用于 Arun,总共 2 行(相同 + 不同),另一行总共 1)

最终输出

所以这是整个代码:

with table2 as (
  select name, b,c, same, different from (select name, b, c, case when (SUBSTR(b,1,4) = c) then '1' else '0' end as same, case when(SUBSTR(b,1,4)!= c) then '1' else '0' end as different
From Table1
group by name, b,c))

select table1.name, table1.b, table1.c, count(table2.same+table2.different) as total from table1 
join table2 on (table2.name = table1.name and table2.b = table1.b)
group by table1.name;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM