Sql 用另一个表合并两个表

Sql 用另一个表合并两个表,sql,database,join,Sql,Database,Join,我有一个典型的N-M关系结构,如下所示: 两个独立的表格: Table Client: id | name 1 | Joe 2 | Marc 及 和一个链接表,如: Table Purchase: idClient | idProduct | Paid 1 | 1 | 3000 1 | 2 | 2999 2 | 3 | 4500 2 | 1 | 1000 我想要一个生成

我有一个典型的N-M关系结构,如下所示:

两个独立的表格:

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

和一个链接表,如:

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中有什么方法可以做到这一点吗


谢谢

您正在尝试执行透视查询;有很多关于stackoverflow的例子。搜索Pivot和MySQL

例如,下面是一个使用CASE语句的示例:

就像@StuartAinsworth所说的那样,您需要执行一个Pivot查询


对于动态方法,请使用以下方法:

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
创建表客户端(
id int,
名称varchar(10)
)
插入到客户端值中(1,“Joe”)
插入客户端值(2,‘Marc’)
创建表格产品(
id int,
名称varchar(10)
)
插入产品价值(1,‘丰田’)
插入产品价值(2,‘福特’)
插入产品价值(3,‘菲亚特’)
创建表购买(
idClient int,
idProduct int,
支付整数
)
插入采购值(1,1,3000)
插入到购买值中(1、2、2999)
插入购买价值(2、3、4500)
插入到购买值中(2,1,1000)
声明@cmd varchar(2048)
声明@prod varchar(10),@count int,@total int
选择@cmd='选择c.name,'
从产品中选择@count=1、@total=max(id)

当@count时,您只需要使用您的表,而不是我创建的临时表来测试它!那很有用!是否有某种方法可以在不显式声明列的情况下动态创建此视图?我的意思是,假设我在DB中放入另一个产品,比如Seat,我希望相同的查询生成一个表,其中Seat包含在列中。有什么想法吗?再次非常感谢。@dariosalvi,你拿到了,如果成功,你可以投票接受答案:)
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