【问题标题】:How to display result of a query in one row when joined with another table [duplicate]与另一个表连接时如何在一行中显示查询结果[重复]
【发布时间】:2014-07-16 22:40:13
【问题描述】:

我尝试搜索,但找不到解决方案。我正在尝试连接两个表,基本上表 2 有多行,表 1 中的一行。但是在显示时,我想列出表 1 中的所有列以及表 2 中的所有字段,但在一行中。即表 2 行将显示为列。

Table 1

ID  Col2    Col3    Col4
1   John    Smith   CA
2   Henry   Bond    FL

表 2

ID (FK) Type    Value
1   Car1        Honda
1   Car2        Toyota
2   Car1        Honda
2   Car2        Nissan
3   Car3        Audi

结果应该是

ID  Col2    Col3    Col4    Car1    Car2    Car3
1   John    Smith   CA      Honda   Toyota  
2   Henry   Bond    FL      Honda   Nissan  Audi

【问题讨论】:

  • 你用的是什么数据库?
  • 一个人拥有的汽车数量最多是多少?您是否关心汽车是否汇总在一个结果列中?在后一种情况下,您可以使用 group_concat(如果是 mysql)listagg(如果是 Oracle)string_agg(如果是 postgresql)等。
  • 感谢 cmets 人。 @Brian DeMilia,不,我不希望它被聚合。事实上,我希望动态生成列。数据库是 SQL Server 2012

标签: sql sql-server-2012 pivot


【解决方案1】:

你在追求这样的事情吗?

SQL 小提琴:http://sqlfiddle.com/#!6/a379d/2

create table people
(
  id bigint not null identity(1,1) primary key
  , firstName nvarchar(32)
  , lastName nvarchar(32)
  , state nchar(2)
)
create table personCar
(
  id bigint not null identity(1,1) primary key
  , personId bigint not null
  , carType nvarchar(32)
  , carModel nvarchar(32)
)

insert people select 'John', 'Smith', 'CA'
insert people select 'Henry', 'Bond', 'FL'

insert personCar select 1, 'Car1', 'Honda'
insert personCar select 1, 'Car2', 'Toyota'
insert personCar select 2, 'Car1', 'Honda'
insert personCar select 2, 'Car2', 'Nissan'
insert personCar select 2, 'Car3', 'Audi'


select firstName, lastName, state
, [Car1], [Car2], [Car3]
from 
(
  select firstName, lastName, state, carModel, carType
  from people p
  inner join personCar c
  on c.personId = p.id
) x
pivot 
(
  max(carModel) for carType in ([Car1], [Car2], [Car3])
) pvt

【讨论】:

  • 感谢约翰LBevan。我已经得到了上面的查询。但是我需要动态生成列,就像我为亨利添加另一辆车(Car4)一样,Car4 应该显示为单独的列。我想我有一个想法,会尝试并告诉你。
  • 实际上我得到了代码,可以在动态生成列的地方工作。现在的问题是我需要从另一个查询中调用这个存储过程。我怎样才能做到这一点?由于列是动态的,因此我无法使用返回值表创建用户定义的函数。
  • 不用担心。您可以为此使用OpenRowset;但很痛苦:blogs.technet.com/b/wardpond/archive/2005/08/01/…
  • 另外(稍微好一点,但仍然不是很好)有 insert * into #temp from exec 方法:stackoverflow.com/questions/653714/…
猜你喜欢
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 2021-03-01
  • 2015-07-16
相关资源
最近更新 更多