[英]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 |
另外,我想为same
和different
列的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 服务器几乎相同)这是可能的解决方案。
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');
same
和different
列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
total_same
和total_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
第一步,您需要对列 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 给你这个:
在 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.