【问题标题】:SQL Results Column Values as ResultsSQL 结果列值作为结果
【发布时间】:2014-04-26 03:58:41
【问题描述】:

我想从提供的示例表中获得我在所需结果中显示的内容。

我一直在努力创建 SQL 来处理这个问题:

CREATE TABLE a (account nvarchar(10), accountname nvarchar(10));
CREATE TABLE b (bid int, bdesc nvarchar(10));
CREATE TABLE C (cid int, bid int, caccount nvarchar(10));

INSERT INTO a VALUES ('a1','a1val');
INSERT INTO a VALUES ('b1','b1val');
INSERT INTO a VALUES ('c1','c1val');
INSERT INTO a VALUES ('d1','d1val');

INSERT INTO b VALUES (1,'val1');
INSERT INTO b VALUES (2,'val2');
INSERT INTO b VALUES (3,'val3');

INSERT INTO c VALUES (1,1,'a1');
INSERT INTO c VALUES (2,1,'b1');
INSERT INTO c VALUES (3,2,'a1');
INSERT INTO c VALUES (4,3,'c1');

--Desired results
--accountname  val1  val2  val3
--a1val        x     x  
--b1val        x
--c1val                    x
--d1val

select * from a
select * from b
select * from c 

drop table a, b, c

【问题讨论】:

标签: sql-server sql-server-2008


【解决方案1】:

此解决方案适用于 bdesc 中任意数量的不同值。

declare @dynamicSQL varchar(max) = ''
declare @columnList varchar(max) = ''
declare @unique table ([bdesc] varchar(10) )
insert into @unique
select distinct [bdesc] from b 
select @columnList = @columnList + '[' + bdesc + '],'  from @unique
set @columnList = SUBSTRING(@columnList, 0, LEN(@columnList))
set @dynamicSQL = '' +
'select *
from
(
select accountname, bdesc
from a as a
left join c as c
on a.account = c.caccount
left join b as b
on c.bid = b.bid
) as src
pivot(
max(bdesc)
for bdesc in (' + @columnList + ')' + '
) as pvt'
exec(@dynamicSQL)

【讨论】:

  • 这应该足以让我继续前进。谢谢。
  • 最大的问题是 val1、2 和 3 是硬编码的。在这个例子中,我永远不会知道表 b 的内容。
  • @user3301576 - 哦......现在你提到它了。
猜你喜欢
  • 2010-11-03
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-15
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多