if I have table1 like this,
Name | Test1 | Test2 |
---|---|---|
Tom | 001 | 001 |
Mary | 001 | 002.2 |
Mike | 002.2 | 001 |
Amy | 003 | 003 |
I want to bind with table2, like below, and conut.
code | String |
---|---|
001 | ADA |
002 | BAD |
002.2 | BAA |
003 | CTG |
I want to get this like that
Name | Tom | Mary | Mike | Amy |
---|---|---|---|---|
ADA | 2 | 1 | 1 | 0 |
BAD | 0 | 0 | 0 | 0 |
BAA | 0 | 1 | 1 | 0 |
CTG | 0 | 0 | 0 | 2 |
How can I achieve in SQL, Thank you.
CodePudding user response:
You can't do this with standard SQL but for example MS SQL has a PIVOT operator. Also Oracle has it. PostgreSQL has a CROSSTAB table function. See this article for more information.
And you can always write a stored procedure if it is supported by your DBMS.
CodePudding user response:
Getting the row-wise name
values into column names in the output calls for a pivot technique, as explained in the first answer.
In order to count
codes by name, you will also need a device to multiply rows based on code : two rows with 001
for name Tom
, one row with 001
and one with 002.2
for name Mary
, etc. Like so :
---- -----
|name|code |
---- -----
|Tom |001 |
|Tom |001 |
|Mary|001 |
|Mary|002.2|
|Mike|002.2|
|Mike|001 |
|Amy |003 |
|Amy |003 |
---- -----
which is easy to count(*) ... group by (name, code)
, yielding a pivotable result.
How to achieve this may vary depending on your rdbms, here's my take in postgresql :
select table1.name, name_code.code, table2.string
from table1
-- create a row for each of (test2, test 2) of each row
cross join unnest(array[test1, test2]) name_code(code)
join table2 on name_code.code = table2.code
dbfiddle (without pivot)