sql - Dynamically display rows as columns -
sql - Dynamically display rows as columns -
i couldn't think of way word title, if can come improve please sense free. there old vb6 app pulls info db have more or less restructured , gives user dump of of product info @ once. need inner joins of these tables together. know how basic inner joins stuck on 1 detail. there few tables there multiple entries each item. example, crossreference table may have multiple cross reference numbers item, or may have one, or may have none @ all. possible have placed dynamically separate columns. this:
item crossreferencenumber xxxxx crossref1 xxxxx crossref2 xxxxx crossref3
could become (after bring together other tables):
item basepart size crossreferencenumber1 crossreferencenumber2 crossreferencenumber3 xxxx xxxx big crossref1 crossref2 crossref3
but if there no cross references, there no cross reference columns. possible or dreaming?
oracle 11g , sql server 2005+ both contain pivot command accomplish want.
http://www.orafaq.com/wiki/pivot
http://msdn.microsoft.com/en-us/library/ms177410.aspx
otherwise need build dynamic sql statement accomplish this.
edit - here go (sql server version).
/* begin set of test info */ if exists (select 1 sys.tables name = n'item') drop table item go if exists (select 1 sys.tables name = n'crossreference') drop table crossreference go create table item ( item varchar(20), basepart varchar(20), size varchar(20) ); create table crossreference ( item varchar(20), crossreferencenumber varchar(20) ); insert item values ('item1', 'b1', 'large'); insert item values ('item2', 'bxx1', 'large'); insert item values ('item3', 'bddf1', 'small'); insert item values ('item4', 'be3f1', 'small'); insert item values ('item5', 'b13vx1', 'small'); insert crossreference values( 'item1', 'crossref1') insert crossreference values('item1', 'crossref2') insert crossreference values('item1', 'crossref3') insert crossreference values('item1', 'crossref4') insert crossreference values('item2', 'crossref1') insert crossreference values('item2', 'crossref1') insert crossreference values('item3', 'crossref1') insert crossreference values('item4', 'crossref2') insert crossreference values('item5', 'crossref5') insert crossreference values('item5', 'crossref1') insert crossreference values('item5', 'crossref2') insert crossreference values('item5', 'crossref3') /* end of test info setup */ /* begin of actual query */ declare @xrefs varchar(2000), @query varchar(8000) select @xrefs = stuff((select distinct '],[' + ltrim(crossreferencenumber) crossreference order '],[' + ltrim(crossreferencenumber) xml path('') ), 1, 2, '') + ']' set @query = 'select * item inner bring together ( select * ( select item, crossreferencenumber crossreference ) t pivot (max(crossreferencenumber) crossreferencenumber in (' + @xrefs + ')) pvt ) xrefs on i.item = xrefs.item order i.item' execute (@query) /* end */
sql sql-server-2008 dynamic inner-join
Comments
Post a Comment