Объединение двух таблиц с помощью другого - PullRequest
2 голосов
/ 14 декабря 2011

У меня есть типичная структура отношений NM, подобная этой:

две независимые таблицы:

Table Client:
id | name
1  | Joe
2  | Marc

и

Table Product:
id | name
1  | Toyota
2  | Ford
3  | Fiat

и таблица ссылок, например:

Table Purchase:
idClient | idProduct | Paid
1        | 1         | 3000
1        | 2         | 2999
2        | 3         | 4500
2        | 1         | 1000

Я бы хотел запрос, который выдает:

client | Toyota | Ford | Fiat
Joe    |  3000  | 2999 | 
Marc   |  1000  |      | 4500

Есть ли способ сделать это в MySQL?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 14 декабря 2011

Вы пытаетесь сделать запрос PIVOT;Есть много примеров на стеке потока.Поиск Pivot и MySQL.

Например, вот один из них, использующий операторы CASE: SQL-запрос для поворота столбца с использованием CASE WHEN

1 голос
/ 14 декабря 2011

Как сказал @StuartAinsworth, вам нужно выполнить сводный запрос.


Для динамического подхода используйте следующее:

create table Client (
id int,
name varchar(10)
)

insert into Client values (1, 'Joe')
insert into Client values (2, 'Marc')

create table Product (
id int,
name varchar(10)
)

insert into Product values (1, 'Toyota')
insert into Product values (2, 'Ford')
insert into Product values (3, 'Fiat')

create table Purchase (
idClient int,
idProduct int,
Paid int
)

insert into Purchase values (1, 1, 3000)
insert into Purchase values (1, 2, 2999)
insert into Purchase values (2, 3, 4500)
insert into Purchase values (2, 1, 1000)


declare @cmd varchar(2048)
declare @prod varchar(10), @count int, @total int

select @cmd = 'select c.name, '

select @count = 1, @total = max(id) from Product

while @count <= @total
begin
    select @prod = name from Product where id = @count

    if(@count <> @total)
    begin
        select @cmd = @cmd + 'sum(CASE WHEN p.name = "' + @prod + '" THEN u.Paid ELSE 0 END) as "' + @prod + '", ' 
    end
    else   
    begin
        select @cmd = @cmd + 'sum(CASE WHEN p.name = "' + @prod + '" THEN u.Paid ELSE 0 END) as "' + @prod + '" ' 
    end
    select @count = @count + 1
end

select @cmd = @cmd + 'from Client c ' +
 + 'inner join Purchase u on u.idClient = c.id ' +
 + 'inner join Product p on p.id = u.idProduct ' +
 + 'group by c.name'


exec(@cmd)

drop table Client
drop table Product
drop table Purchase
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...