如何将 sql 结果条目旋转到列中(透视)
How rotate sql result entries into columns (pivot)
我有table个
| id | value | comment |
|--------------------------|
| 1 | Some1 | comm1 |
|--------------------------|
| 2 | Some2 | comm2 |
|--------------------------|
我有 table b 和 table a 作为外键
| id | id_a |name | amount | factor |
|--------------------------------------------|
| 1 | 1 |Car | 12 | 2 |
|--------------------------------------------|
| 2 | 1 |Bike | 22 | 5 |
|--------------------------------------------|
| 3 | 2 |Car | 54 | 1 |
|--------------------------------------------|
| 4 | 2 |Bike | 55 | 4 |
|--------------------------------------------|
因此我想要一个组合:
|id| value | comment | Car_Amount | Car_factor | Bike_Amount | Bike_Factor |
|--------------------------------------------------------------------------|
| 1| Some1 | comm1 | 12 | 2 | 22 | 5 |
|--------------------------------------------------------------------------|
| 2| Some2 | comm2 | 54 | 1 | 55 | 4 |
|--------------------------------------------------------------------------|
据我所知,这不是一个支点。但我不确定这是否是个好习惯。我不是 SQL 方面的专家,但像这样混合 table 看起来完全错误。
我的意思是 "they" 想要将其作为一个平面结果用于报告...
有可能吗?
谢谢
SELECT t1.id,
t1.value,
MAX(CASE WHEN t2.name = 'Car' THEN t2.amount END) AS Car_Amount,
MAX(CASE WHEN t2.name = 'Car' THEN t2.factor END) AS Car_Factor,
MAX(CASE WHEN t2.name = 'Bike' THEN t2.amount END) AS Bike_amount,
MAX(CASE WHEN t2.name = 'Bike' THEN t2.factor END) AS Bike_Factor
FROM a t1
INNER JOIN b t2
ON t1.id = t2.id_a
GROUP BY t1.id
试试这个
SELECT ID,value,comment,
SUM(CASE WHEN Name='Car' THEN Amount END) AS Car_Amount,
SUM(CASE WHEN Name='Car' THEN factor END) AS Car_factor ,
SUM(CASE WHEN Name='Bike' THEN Amount END) AS Bike_Amount,
SUM(CASE WHEN Name='Bike' THEN factor END) AS Bike_factor
FROM TableB
INNER JOIN TableA on TableB.ID= TableA.id
Group by ID,value,comment
像这样聚合值:
select
a.id, a.value, a.comment,
sum(case when b.name='Car' then b.amount end) as Car_Amount,
sum(case when b.name='Car' then b.factor end) as Car_Factor,
sum(case when b.name='Bike' then b.amount end) as Bike_Amount,
sum(case when b.name='Bike' then b.factor end) as Bike_Factor
from a left join b on a.id=b.id_a
group by a.id, a.value, a.comment;
我有table个
| id | value | comment |
|--------------------------|
| 1 | Some1 | comm1 |
|--------------------------|
| 2 | Some2 | comm2 |
|--------------------------|
我有 table b 和 table a 作为外键
| id | id_a |name | amount | factor |
|--------------------------------------------|
| 1 | 1 |Car | 12 | 2 |
|--------------------------------------------|
| 2 | 1 |Bike | 22 | 5 |
|--------------------------------------------|
| 3 | 2 |Car | 54 | 1 |
|--------------------------------------------|
| 4 | 2 |Bike | 55 | 4 |
|--------------------------------------------|
因此我想要一个组合:
|id| value | comment | Car_Amount | Car_factor | Bike_Amount | Bike_Factor |
|--------------------------------------------------------------------------|
| 1| Some1 | comm1 | 12 | 2 | 22 | 5 |
|--------------------------------------------------------------------------|
| 2| Some2 | comm2 | 54 | 1 | 55 | 4 |
|--------------------------------------------------------------------------|
据我所知,这不是一个支点。但我不确定这是否是个好习惯。我不是 SQL 方面的专家,但像这样混合 table 看起来完全错误。 我的意思是 "they" 想要将其作为一个平面结果用于报告...
有可能吗?
谢谢
SELECT t1.id,
t1.value,
MAX(CASE WHEN t2.name = 'Car' THEN t2.amount END) AS Car_Amount,
MAX(CASE WHEN t2.name = 'Car' THEN t2.factor END) AS Car_Factor,
MAX(CASE WHEN t2.name = 'Bike' THEN t2.amount END) AS Bike_amount,
MAX(CASE WHEN t2.name = 'Bike' THEN t2.factor END) AS Bike_Factor
FROM a t1
INNER JOIN b t2
ON t1.id = t2.id_a
GROUP BY t1.id
试试这个
SELECT ID,value,comment,
SUM(CASE WHEN Name='Car' THEN Amount END) AS Car_Amount,
SUM(CASE WHEN Name='Car' THEN factor END) AS Car_factor ,
SUM(CASE WHEN Name='Bike' THEN Amount END) AS Bike_Amount,
SUM(CASE WHEN Name='Bike' THEN factor END) AS Bike_factor
FROM TableB
INNER JOIN TableA on TableB.ID= TableA.id
Group by ID,value,comment
像这样聚合值:
select
a.id, a.value, a.comment,
sum(case when b.name='Car' then b.amount end) as Car_Amount,
sum(case when b.name='Car' then b.factor end) as Car_Factor,
sum(case when b.name='Bike' then b.amount end) as Bike_Amount,
sum(case when b.name='Bike' then b.factor end) as Bike_Factor
from a left join b on a.id=b.id_a
group by a.id, a.value, a.comment;