读书人

sql按月度区间查询记录

发布时间: 2012-09-29 10:30:01 作者: rapoo

sql按月份区间查询记录
表是这样的:
车型 年份 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)*/ 

读书人网 >SQL Server

热点推荐