车型 年份 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月
车型 年份 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
woca
#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月]
列名加中括号: [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
*/
----- ----------- ---------- -----------
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月...了吗.
而且如果是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月
车型 年份 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
woca
#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月]
列名加中括号: [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
*/
----- ----------- ---------- -----------
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月...了吗.
而且如果是2003年6月到2005年7月,这样不就有2个6月,2个7月,2个8月,2个9月...了吗.
#12
只是没有把月份显示出来 还是有年份的
#13
没有把年份显示出来