+ -
当前位置:首页 → 问答吧 → 关于列转行的问题

关于列转行的问题

时间:2011-11-29

来源:互联网

我参考了
http://topic.csdn.net/u/20110729/15/A946BF44-B8B1-4B52-9BB7-5DEFD92603F0.html
的做法,但是还是出现这要那样的问题
数据库表结构
/****** Object: Table [dbo].[MSRP] Script Date: 11/29/2011 15:51:58 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[MSRP](
[MSRP_ID] [int] IDENTITY(1,1) NOT NULL,
[Seq] [int] NULL,
[Vehicle_ID] [int] NULL,
[MSRP_Vehicle_ID_Name] [nvarchar](100) NULL,
[Msrp] [decimal](18, 0) NULL,
[Time] [datetime] NULL,
[Status] [int] NULL,
[CreateUser] [nchar](10) NULL,
[UpdateUser] [nchar](10) NULL,
[DeleteUser] [nchar](10) NULL,
[CreateDateTime] [datetime] NULL,
[UpdateDateTime] [datetime] NULL,
[DeleteDateTime] [datetime] NULL,
[RowOperation] [int] NULL,
[ProjectCompile] [nvarchar](100) NULL,
 CONSTRAINT [PK_MSRP] PRIMARY KEY CLUSTERED 
(
[MSRP_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[MSRP] ADD CONSTRAINT [DF__MSRP__RowOperati__3B40CD36] DEFAULT ((2)) FOR [RowOperation]
GO

主要部分数据贴图
MSRP_ID Seq Vehicle_ID MSRP_Vehicle_ID_Name Msrp Time
201392 NULL 5269 2008 御轩 2.5L 4AT 旗舰型 199800 2009-06-01 00:00:00.000
201393 NULL 5269 2008 御轩 2.5L 4AT 旗舰型 199800 2009-07-01 00:00:00.000
201394 NULL 5269 2008 御轩 2.5L 4AT 旗舰型 199800 2009-08-01 00:00:00.000
201395 NULL 5269 2008 御轩 2.5L 4AT 旗舰型 0 2009-09-01 00:00:00.000
201396 NULL 5269 2008 御轩 2.5L 4AT 旗舰型 0 2009-10-01 00:00:00.000
201397 NULL 5269 2008 御轩 2.5L 4AT 旗舰型 0 2009-11-01 00:00:00.000
201398 NULL 5269 2008 御轩 2.5L 4AT 旗舰型 0 2009-12-01 00:00:00.000

需要的效果就是
MSRP_Vehicle_ID_Name 2009-06-01 2009-07-01 2009-08-01 2009-09-01 2009-10-01 2009-11-01 2009-12-01 
2008 御轩 2.5L 4AT 旗舰型 199800 199800 199800 0 0 0 0

但是时间范围是可以选择的比如我选择 2009-08-01 到 2009-09-01 
需要的效果就是
MSRP_Vehicle_ID_Name 2009-08-01 2009-09-01 
2008 御轩 2.5L 4AT 旗舰型 199800 0  
如果是 2009-06-01 到2009-12-01 
 需要的效果就是
MSRP_Vehicle_ID_Name 2009-06-01 2009-07-01 2009-08-01 2009-09-01 2009-10-01 2009-11-01 2009-12-01 
2008 御轩 2.5L 4AT 旗舰型 199800 199800 199800 0 0 0 0

现在是写完了但是效率很低
我数据库大概才218100条数据
如果只查询 2009-09-01 也就才3312
也就是3312列,
效率实在不行
下面代码是可以运行的
declare @sql nvarchar(max),@sql2 nvarchar(max)
select @sql='',@sql2=''
select @sql=@sql+',isnull(['+Time+'],''0%'') as ['+Time+']',@sql2=@sql2+','+Time+'' from MSRP order by Time
select @sql=stuff(@sql,1,1,''),@sql2=stuff(@sql2,1,1,'')
set @sql2='
select MSRP_Vehicle_ID_Name AS [车型名称],'+@sql+' from 
(select MSRP_Vehicle_ID_Name,Msrp,Time from MSRP
where Time =''2009-09-01 00:00:00.000'' ) as aa
pivot
(
  max(Msrp)
  for Time
  in ('+@sql2+')
)as b order by MSRP_Vehicle_ID_Name
'
exec(@sql2)

作者: bluewater_cg   发布时间: 2011-11-29

动态SQL 的效率都不高。

作者: fredrickhu   发布时间: 2011-11-29

凑活用吧

作者: ssp2009   发布时间: 2011-11-29

热门下载

更多