sql按月份区间查询记录

时间:2021-12-17 21:39:08
表是这样的:
车型  年份  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月 怎么查出这期间的记录?


13 个解决方案

#1



--参考
select 车型,年份,
SUM(case when 月 = 1 then numbercol else 0 END) as [1月],
SUM(case when 月 = 2 then numbercol else 0 END) as [2月],
SUM(case when 月 = 3 then numbercol else 0 END) as [3月],
SUM(case when 月 = 4 then numbercol else 0 END) as [4月],
SUM(case when 月 = 5 then numbercol else 0 END) as [5月],
SUM(case when 月 = 6 then numbercol else 0 END) as [6月],
SUM(case when 月 = 7 then numbercol else 0 END) as [7月],
SUM(case when 月 = 8 then numbercol else 0 END) as [8月],
SUM(case when 月 = 9 then numbercol else 0 END) as [9月],
SUM(case when 月 = 10 then numbercol else 0 END) as [10月],
SUM(case when 月 = 11 then numbercol else 0 END) as [11月],
SUM(case when 月 = 12 then numbercol else 0 END) as [12月]
FROM TB
where --lz的时间条件
GROUP BY 车型,年份

#2


没有月份的字段 只有1月-12月 比如查1-6月 结果就是:

车型 年份 1月 2月 3月 4月 5月 6月 

#3


--> 测试数据:[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 ALL
SELECT 'ft',2003,3,2,1,3,3,1,0,0,1,2,3,0 UNION ALL
SELECT 'asd',2004,2,1,0,0,2,4,1,0,2,3,2,0
--------------开始查询--------------------------
declare @begin_date datetime,@end_date datetime
set @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_date
group by [车型]


----------------结果----------------------------
/* 
车型 (无列名)
asd 3
ft 7
suv 7
*/

#4


引用 2 楼  的回复:
没有月份的字段 只有1月-12月 比如查1-6月 结果就是:

车型 年份 1月 2月 3月 4月 5月 6月

woca sql按月份区间查询记录

#5



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 b2
select 'suv', 2003, 1, 6, 2, 2, 4, 0, 1, 0, 3, 0, 1, 2 union all
select 'ft', 2003, 3, 2, 1, 3, 3, 1, 0, 0, 1, 2, 3, 0 union all
select '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 t
where 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月         0
suv   2003        7月         1
suv   2003        8月         0
suv   2003        9月         3
suv   2003        10月        0
suv   2003        11月        1
suv   2003        12月        2
ft    2003        6月         1
ft    2003        7月         0
ft    2003        8月         0
ft    2003        9月         1
ft    2003        10月        2
ft    2003        11月        3
ft    2003        12月        0
asd   2004        1月         2
asd   2004        2月         1
asd   2004        3月         0

(17 row(s) affected)
*/

#6


有没有高手帮忙解决下~~~

#7


谢谢 4楼和5楼的 觉得5楼的很好

#8


为什么在我这里报错 列名‘1月’无效  是为什么

#9


检查一下是否有这个字段.
列名加中括号: [1月]

#10


车型    年份          月份       数量
----- ----------- ---------- -----------
suv   2003        6月         0
suv   2003        7月         1
suv   2003        8月         0
suv   2003        9月         3
suv   2003        10月        0
suv   2003        11月        1
suv   2003        12月        2
ft    2003        6月         1
ft    2003        7月         0
ft    2003        8月         0
ft    2003        9月         1
ft    2003        10月        2
ft    2003        11月        3
ft    2003        12月        0
asd   2004        1月         2
asd   2004        2月         1
asd   2004        3月         0
*/
如果我想把这个结果在转回下面表那样的结果应该怎么做
车型    年份          月份       数量
----- ----------- ---------- -----------
车型    6月      7月    8月    9月    10月     11月    12月    1月    2月    3月  
suv      0      1     0      3     0       1      2      0      0     0
ft       1      0     0      1     2       3      0      0      0     0
asd      0      0     0      0     0       0      0      2      1     0
*/

#11


这样年份不就丢失了吗? 
而且如果是2003年6月到2005年7月,这样不就有2个6月,2个7月,2个8月,2个9月...了吗.

#12


只是没有把月份显示出来 还是有年份的 

#13


没有把年份显示出来

#1



--参考
select 车型,年份,
SUM(case when 月 = 1 then numbercol else 0 END) as [1月],
SUM(case when 月 = 2 then numbercol else 0 END) as [2月],
SUM(case when 月 = 3 then numbercol else 0 END) as [3月],
SUM(case when 月 = 4 then numbercol else 0 END) as [4月],
SUM(case when 月 = 5 then numbercol else 0 END) as [5月],
SUM(case when 月 = 6 then numbercol else 0 END) as [6月],
SUM(case when 月 = 7 then numbercol else 0 END) as [7月],
SUM(case when 月 = 8 then numbercol else 0 END) as [8月],
SUM(case when 月 = 9 then numbercol else 0 END) as [9月],
SUM(case when 月 = 10 then numbercol else 0 END) as [10月],
SUM(case when 月 = 11 then numbercol else 0 END) as [11月],
SUM(case when 月 = 12 then numbercol else 0 END) as [12月]
FROM TB
where --lz的时间条件
GROUP BY 车型,年份

#2


没有月份的字段 只有1月-12月 比如查1-6月 结果就是:

车型 年份 1月 2月 3月 4月 5月 6月 

#3


--> 测试数据:[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 ALL
SELECT 'ft',2003,3,2,1,3,3,1,0,0,1,2,3,0 UNION ALL
SELECT 'asd',2004,2,1,0,0,2,4,1,0,2,3,2,0
--------------开始查询--------------------------
declare @begin_date datetime,@end_date datetime
set @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_date
group by [车型]


----------------结果----------------------------
/* 
车型 (无列名)
asd 3
ft 7
suv 7
*/

#4


引用 2 楼  的回复:
没有月份的字段 只有1月-12月 比如查1-6月 结果就是:

车型 年份 1月 2月 3月 4月 5月 6月

woca sql按月份区间查询记录

#5



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 b2
select 'suv', 2003, 1, 6, 2, 2, 4, 0, 1, 0, 3, 0, 1, 2 union all
select 'ft', 2003, 3, 2, 1, 3, 3, 1, 0, 0, 1, 2, 3, 0 union all
select '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 t
where 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月         0
suv   2003        7月         1
suv   2003        8月         0
suv   2003        9月         3
suv   2003        10月        0
suv   2003        11月        1
suv   2003        12月        2
ft    2003        6月         1
ft    2003        7月         0
ft    2003        8月         0
ft    2003        9月         1
ft    2003        10月        2
ft    2003        11月        3
ft    2003        12月        0
asd   2004        1月         2
asd   2004        2月         1
asd   2004        3月         0

(17 row(s) affected)
*/

#6


有没有高手帮忙解决下~~~

#7


谢谢 4楼和5楼的 觉得5楼的很好

#8


为什么在我这里报错 列名‘1月’无效  是为什么

#9


检查一下是否有这个字段.
列名加中括号: [1月]

#10


车型    年份          月份       数量
----- ----------- ---------- -----------
suv   2003        6月         0
suv   2003        7月         1
suv   2003        8月         0
suv   2003        9月         3
suv   2003        10月        0
suv   2003        11月        1
suv   2003        12月        2
ft    2003        6月         1
ft    2003        7月         0
ft    2003        8月         0
ft    2003        9月         1
ft    2003        10月        2
ft    2003        11月        3
ft    2003        12月        0
asd   2004        1月         2
asd   2004        2月         1
asd   2004        3月         0
*/
如果我想把这个结果在转回下面表那样的结果应该怎么做
车型    年份          月份       数量
----- ----------- ---------- -----------
车型    6月      7月    8月    9月    10月     11月    12月    1月    2月    3月  
suv      0      1     0      3     0       1      2      0      0     0
ft       1      0     0      1     2       3      0      0      0     0
asd      0      0     0      0     0       0      0      2      1     0
*/

#11


这样年份不就丢失了吗? 
而且如果是2003年6月到2005年7月,这样不就有2个6月,2个7月,2个8月,2个9月...了吗.

#12


只是没有把月份显示出来 还是有年份的 

#13


没有把年份显示出来