I’m new to SQL and have very basic queries in GCP.
Let’s consider this table below:
Name | B | C |
---|---|---|
Arun | 1234-5678 | 1234 |
Tara | 6789 – 7654 | 6789 |
Arun | 4567 | 4324 |
Here, I want to compare column B and C and if they match then give 1 else 0 in column same
and else different
(which we have to create).
So here the catch:
- if column
B
has1234-5678
and columnC
has1234
, then the column should match considering only the number before the “-” in the value.
The output should be :
Name | B | C | same | different |
---|---|---|---|---|
Arun | 1234-5678 | 1234 | 1 | 0 |
Tara | 6789 – 7654 | 6789 | 1 | 0 |
Arun | 4567 | 4324 | 0 | 1 |
Also, I want to count the values of 1 for each values in Name
for same
and different
columns.
So far I’ve tried this:
SELECT name, b, c , if(b = c, 1, 0) as same, if (b!=c,1,0) as different, count(same), count(different) From Table
Advertisement
Answer
using “MySQL” (will work almost same with SQL server as well) here’s the possible solution.
Step 1) Setup table
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');
Step 2) same
& different
columns
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
Step 3) Join both results to get total_same
& total_different
for each user
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