我确实想创建一个能够在列中选择多行的选择。如果一年不存在,则显示该年的NULL值
e.g。下表
CREATE TABLE [dbo].[MPG_TABLE](
[Driver] [char](40) NULL,
[Plate] [char](20) NOT NULL,
[Type] [char](20) NOT NULL,
[Build] [char](6) NULL,
[Miles] [float] NULL,
[Gallon] [float] NULL,
[MPG] [numeric](8, 2) NULL
) ON [PRIMARY]
填写表格:
insert into MPG_TABLE (Driver, Plate, Type, Build, Miles, Gallon)
values ('JOHN', 'AAAA', '4X4', '2010', 20000, 2100),
('JOHN', 'AAAA', '4X4', '2011', 30000, 2900),
('JOHN', 'AAAA', '4X4', '2012', 25000, 2300),
('JOHN', 'AAAA', '4X4', '2013', 21420, 2130),
('PETER', 'BBBB', 'LUXE', '2011', 22040, 1650),
('PETER', 'BBBB', 'LUXE', '2012', 24000, 1800),
('JACK', 'CCCC', 'LORRY', '2009', 180040, 96005),
('JACK', 'CCCC', 'LORRY', '2010', 220040, 100005),
('JACK', 'CCCC', 'LORRY', '2011', 240000, 100235),
('ADRIAN', 'EEEE', 'LUXE', '2010', 19040, 1450),
('ADRIAN', 'EEEE', 'LUXE', '2011', 30000, 2200),
('ADRIAN', 'DDDD', 'LUXE', '2012', 22040, 1650),
('ADRIAN', 'DDDD', 'LUXE', '2013', 24000, 1800),
('JERRY', 'FFFF', 'LUXE', '2013', 2000, 100)
现在更新最后一栏:
update MPG_TABLE
set MPG = (Miles / Gallon)
我有类似的东西,但它没有显示我想要的东西:
select distinct c.Driver, c.Plate, c.Type, a.build, a.Miles, a.gallon,
a.mpg, b.build, b.miles, b.gallon, b.mpg, c.build, c.miles, c.gallon, c.mpg
from MPG_TABLE as a left outer join MPG_TABLE as b
on ISNULL(a.Driver, null) = ISNULL(b.driver, null),
MPG_TABLE as c
where a.Build = '2012'
and b.Build = '2013'
and c.Build = '2011'
结果应如下所示:
2009 2010 2011
Driver Plate Type Miles Gallon MPG Miles Gallon MPG Miles
JOHN AAAA 4X4 NULL NULL NULL 20000 2100 9.52 30000
PETER BBBB LUXE NULL NULL NULL NULL NULL NULL 22040
JACK CCCC LORRY 180040 96005 1.88 220040 100005 2.2 240000
ADRIAN EEEE LUXE NULL NULL NULL 19040 1450 13.13 30000
ADRIAN DDDD LUXE NULL NULL NULL NULL NULL NULL NULL
JERRY FFFF LUXE NULL NULL NULL NULL NULL NULL NULL
如何为此创建选择?
答案 0 :(得分:0)
尝试此查询:
select Driver, Plate, Type
, min(case Build when '2009' then Miles end) as Miles2009
, min(case Build when '2009' then Gallon end) as Gallon2009
, min(case Build when '2009' then MPG end) as MPG2009
, min(case Build when '2010' then Miles end) as Miles2010
, min(case Build when '2010' then Gallon end) as Gallon2010
, min(case Build when '2010' then MPG end) as MPG2010
, min(case Build when '2011' then Miles end) as Miles2011
, min(case Build when '2011' then Gallon end) as Gallon2011
, min(case Build when '2011' then MPG end) as MPG2011
, min(case Build when '2012' then Miles end) as Miles2012
, min(case Build when '2012' then Gallon end) as Gallon2012
, min(case Build when '2012' then MPG end) as MPG2012
, min(case Build when '2013' then Miles end) as Miles2013
, min(case Build when '2013' then Gallon end) as Gallon2013
, min(case Build when '2013' then MPG end) as MPG2013
from MPG_TABLE t
cross join (values(1),(2),(3),(4),(5))b(b) -- number of years you want to display
group by Driver, Plate, Type
但请记住一件重要的事情:像这样的转动应始终在客户端完成,不在服务器上 !!!
答案 1 :(得分:-1)
试试这个:
CREATE TABLE #MPG_TABLE(
[Driver] [char](40) NULL,
[Plate] [char](20) NOT NULL,
[Type] [char](20) NOT NULL,
[Build] [char](6) NULL,
[Miles] [float] NULL,
[Gallon] [float] NULL,
[MPG] [numeric](8, 2) NULL
) ON [PRIMARY]
insert into #MPG_TABLE (Driver, Plate, Type, Build, Miles, Gallon)
values ('JOHN', 'AAAA', '4X4', '2010', 20000, 2100),
('JOHN', 'AAAA', '4X4', '2011', 30000, 2900),
('JOHN', 'AAAA', '4X4', '2012', 25000, 2300),
('JOHN', 'AAAA', '4X4', '2013', 21420, 2130),
('PETER', 'BBBB', 'LUXE', '2011', 22040, 1650),
('PETER', 'BBBB', 'LUXE', '2012', 24000, 1800),
('JACK', 'CCCC', 'LORRY', '2009', 180040, 96005),
('JACK', 'CCCC', 'LORRY', '2010', 220040, 100005),
('JACK', 'CCCC', 'LORRY', '2011', 240000, 100235),
('ADRIAN', 'EEEE', 'LUXE', '2010', 19040, 1450),
('ADRIAN', 'EEEE', 'LUXE', '2011', 30000, 2200),
('ADRIAN', 'DDDD', 'LUXE', '2012', 22040, 1650),
('ADRIAN', 'DDDD', 'LUXE', '2013', 24000, 1800),
('JERRY', 'FFFF', 'LUXE', '2013', 2000, 100)
update #MPG_TABLE
set MPG = (Miles / Gallon)
Declare @cols varchar(MAX),
@query VARCHAR(MAX)
select @cols=STUFF((SELECT ', [' + New_Col + ']'
FROM (
select distinct case
when COL='Miles' then CAST(Build as varchar) + 'Miles'
when COL='Gallon' then CAST(Build as varchar) + 'Gallon'
when COL='MPG' then CAST(Build as varchar) + 'MPG'
end New_Col
from (select Driver
,Plate
,[Type]
,Build
,CAST(Miles as varchar) Miles
,CAST(Gallon as varchar) Gallon
,CAST(MPG as varchar) MPG
from #MPG_TABLE
)a
UNPIVOT
(
Value
for COL in ([Miles],[Gallon],[MPG])
)UPVT
)a
for XML Path('')), 1, 2, '');
print @cols;
Set @query= 'select * from
(select Driver
,Plate
,[Type]
,case
when COL=''Miles'' then CAST(Build as varchar) + ''Miles''
when COL=''Gallon'' then CAST(Build as varchar) + ''Gallon''
when COL=''MPG'' then CAST(Build as varchar) + ''MPG''
end New_Col,
Value
from (select Driver
,Plate
,[Type]
,Build
,CAST(Miles as varchar) Miles
,CAST(Gallon as varchar) Gallon
,CAST(MPG as varchar) MPG
from #MPG_TABLE
)a
UNPIVOT
(
Value
for COL in ([Miles],[Gallon],[MPG])
)UPVT
)b
pivot
(
MAX(Value)
for New_Col in ('+@cols+')
) PVT '
exec(@query)