表是这样的:
车型 年份 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
suv 2003 1 6 2 2 4 0 1 0 3 0 1 2
ft 2003 3 2 1 3 3 1 0 0 1 2 3 0
asd 2004 2 1 0 0 2 4 1 0 2 3 2 0
输入两个参数 比如 2003年6月 至 2004年3月 怎么查出这期间的记录?
------解决方案--------------------
- SQL code
--> 测试数据:[tb]IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]GO CREATE TABLE [tb]([车型] VARCHAR(3),[年份] INT,[1月] INT,[2月] INT,[3月] INT,[4月] INT,[5月] INT,[6月] INT,[7月] INT,[8月] INT,[9月] INT,[10月] INT,[11月] INT,[12月] INT)INSERT [tb]SELECT 'suv',2003,1,6,2,2,4,0,1,0,3,0,1,2 UNION ALLSELECT 'ft',2003,3,2,1,3,3,1,0,0,1,2,3,0 UNION ALLSELECT 'asd',2004,2,1,0,0,2,4,1,0,2,3,2,0--------------开始查询--------------------------declare @begin_date datetime,@end_date datetimeset @begin_date= '2003-6-01'set @end_date='2004-03-01'select [车型],sum([num])from( SELECT [车型],[日期]=convert(varchar(10),ltrim([年份])+'-'+replace([month],'月','-01'),120),[num] FROM [tb] UNPIVOT ([num] FOR [month] IN ([1月], [2月], [3月], [4月], [5月], [6月], [7月], [8月], [9月], [10月], [11月], [12月]) )unp) t where [日期] between @begin_date and @end_dategroup by [车型]----------------结果----------------------------/* 车型 (无列名)asd 3ft 7suv 7*/
------解决方案--------------------
- SQL code
create table b2(车型 varchar(5), 年份 int, [1月] int, [2月] int, [3月] int, [4月] int, [5月] int, [6月] int, [7月] int, [8月] int, [9月] int, [10月] int, [11月] int, [12月] int) insert into b2select 'suv', 2003, 1, 6, 2, 2, 4, 0, 1, 0, 3, 0, 1, 2 union allselect 'ft', 2003, 3, 2, 1, 3, 3, 1, 0, 0, 1, 2, 3, 0 union allselect 'asd', 2004, 2, 1, 0, 0, 2, 4, 1, 0, 2, 3, 2, 0--输入两个参数declare @p1 varchar(10),@p2 varchar(10)select @p1='2003年6月',@p2='2004年3月';--查出这期间的记录with t as(select 车型,年份,u.col,u.val from b2 b unpivot(val for col in ([1月],[2月],[3月],[4月], [5月],[6月],[7月],[8月], [9月],[10月],[11月],[12月])) u)select * from twhere cast(rtrim(年份)+'/'+replace(col,'月','')+'/01' as date)between cast(replace(replace(@p1,'年','/'),'月','/01') as date)and cast(replace(replace(@p2,'年','/'),'月','/01') as date);/*车型 年份 col val----- ----------- ---------- -----------suv 2003 6月 0suv 2003 7月 1suv 2003 8月 0suv 2003 9月 3suv 2003 10月 0suv 2003 11月 1suv 2003 12月 2ft 2003 6月 1ft 2003 7月 0ft 2003 8月 0ft 2003 9月 1ft 2003 10月 2ft 2003 11月 3ft 2003 12月 0asd 2004 1月 2asd 2004 2月 1asd 2004 3月 0(17 row(s) affected)*/