I have the following table:
| id | name | type | score |
|---|---|---|---|
| 1 | john | orange | 2345 |
| 2 | john | yellow | 5 |
| 3 | john | black | 5454540 |
| 4 | jack | orange | 1123 |
| 5 | jack | yellow | 1000 |
| 6 | jack | black | 86943 |
| 7 | jane | orange | 9876 |
| 8 | jane | yellow | 10000 |
| 9 | jane | black | 102233 |
comment;
id : inte
name : same name save more times to more rows,
score: it is int data
type : it has string data black,white,yellow,purple,orange
I'm using the following queries to calculate two score totals
SELECT name,sum(score) as `first`
FROM salary
WHERE type = 'orange'
SELECT name,sum(score) as `second`
FROM salary
WHERE type in ('black','yellow')
i want see result that ( all names must be group, single name.)
| name | FirstScore | SecondScore |
|---|---|---|
| john | 2345 | 5454545 |
| jack | 1123 | 87943 |
| jane | 9876 | 112233 |
CodePudding user response:
Use a conditional SUM() to aggregate the values based on type:
SELECT name
, SUM(CASE WHEN type IN ('orange') THEN score END ) AS FirstScore
, SUM(CASE WHEN type IN ('yellow','black') THEN score END ) AS SecondScore
FROM salary
GROUP BY Name
Results:
| name | FirstScore | SecondScore |
|---|---|---|
| john | 2345 | 5454545 |
| jack | 1123 | 87943 |
| jane | 9876 | 112233 |
db<>fiddle here
CodePudding user response:
Something like this (but this is untested):
SELECT
salary.name,
first.score as "first_score",
second.score as "second_score"
FROM salary
LEFT JOIN (SELECT name,sum(score) as score
FROM salary
WHERE type = 'orange'
) as first ON first.name = salary.name
LEFT JOIN (SELECT name,sum(score) as score
FROM salary
WHERE type in ('black','yellow')
) as second ON second.name = salary.name
