技术CTO-关注编程入门知识,提供编程入门教程

您的位置: 首页 > 数据库 > sqlserver > 正文

按月份查询

来源: 技术CTO 阅读:

数据表记录如下:

ID         录入日期           产量     
1           2015-6-1          100
2           2015-6-2          80
3           2015-6-3          100
4           2015-6-10         70
5           2016-6-2          100
6           2016-6-3          100
7           2016-6-5          100
8           2016-7-1          100

得到如下表格:

 月 份           产量        去年同月        产量
2016-6         300          2015-6           350   
2016-7         100          2015-7          0

请问确定当前的年份?
请问怎样确定当前的年份?
引用 1 楼 ap0405140 的回复:
请问确定当前的年份?


当前年份就是今年

select t.月份,t.产量,'去年同月'=u.月份,u.产量
  from 
(select '月份'=convert(varchar(7),录入日期,23),
            '产量'=sum(产量)
   from [表名]
   where convert(varchar(4),录入日期,23)=convert(varchar(4),getdate(),23)
   group by convert(varchar(7),录入日期,23)) t
 left join
(select '月份'=convert(varchar(7),录入日期,23),
            '产量'=sum(产量)
   from [表名]
   where convert(varchar(4),录入日期,23)=convert(varchar(4),dateadd(yyyy,-1,getdate()),23) 
   group by convert(varchar(7),录入日期,23)) u on right(t.月份,2)=right(u.月份,2)

select t.月份,t.产量,'去年同月'=u.月份,'产量'=isnull(u.产量,0)
  from 
(select '月份'=convert(varchar(7),录入日期,23),
            '产量'=sum(产量)
   from [表名]
   where convert(varchar(4),录入日期,23)=convert(varchar(4),getdate(),23)
   group by convert(varchar(7),录入日期,23)) t
 left join
(select '月份'=convert(varchar(7),录入日期,23),
            '产量'=sum(产量)
   from [表名]
   where convert(varchar(4),录入日期,23)=convert(varchar(4),dateadd(yyyy,-1,getdate()),23) 
   group by convert(varchar(7),录入日期,23)) u on right(t.月份,2)=right(u.月份,2)

DECLARE @t TABLE(ID INT,录入日期 DATETIME,产量 INT)   
INSERT INTO @t (id,录入日期,产量)VALUES 
(1,'2015-6-1'        ,100)
,(2,'2015-6-2'        ,80 )
,(3,'2015-6-3'        ,100)
,(4,'2015-6-10'       ,70 )
,(5,'2016-6-2'        ,100)
,(6,'2016-6-3'        ,100)
,(7,'2016-6-5'        ,100)
,(8,'2016-7-1'        ,100)

;WITH c1 AS (
SELECT MONTH(录入日期) AS 今年月分,SUM(产量) 汇总 FROM @t WHERE YEAR(录入日期)=YEAR(GETDATE()) GROUP BY MONTH(录入日期)
),c2 AS (
SELECT MONTH(录入日期) AS 去年月分,SUM(产量) 汇总 FROM @t WHERE YEAR(录入日期)=YEAR(GETDATE())-1 GROUP BY MONTH(录入日期)
)
SELECT c1.*,ISNULL(c2.去年月分,c1.今年月分) AS 去年月分,ISNULL(c2.汇总,0) AS 去年汇总 FROM c1 LEFT JOIN c2 ON c1.今年月分=c2.去年月分;

/*
今年月分        汇总          去年月分        去年汇总
----------- ----------- ----------- -----------
6           300         6           350
7           100         7           0
*/

月 份           产量        去年同月        产量
2016-01 52208.80        NULL       0.00
2016-02 113459.05 NULL 0.00
2016-03 198921.22 NULL 0.00
2016-04 258350.62 NULL 0.00
2016-05 318793.99 NULL 0.00
2016-06 162168.37 NULL 0.00


得到的结果不对吧
引用 5 楼 ap0405140 的回复:

select t.月份,t.产量,'去年同月'=u.月份,'产量'=isnull(u.产量,0)
  from 
(select '月份'=convert(varchar(7),录入日期,23),
            '产量'=sum(产量)
   from [表名]
   where convert(varchar(4),录入日期,23)=convert(varchar(4),getdate(),23)
   group by convert(varchar(7),录入日期,23)) t
 left join
(select '月份'=convert(varchar(7),录入日期,23),
            '产量'=sum(产量)
   from [表名]
   where convert(varchar(4),录入日期,23)=convert(varchar(4),dateadd(yyyy,-1,getdate()),23) 
   group by convert(varchar(7),录入日期,23)) u on right(t.月份,2)=right(u.月份,2)


得到的结果不对
确定表里有2015年的数据吗?

select t.月份,t.产量,'去年同月'=isnull(u.月份,rtrim(cast(left(t.月份,4) as int)-1)+right(t.月份,3)),'产量'=isnull(u.产量,0)
  from 
(select '月份'=convert(varchar(7),录入日期,23),
            '产量'=sum(产量)
   from sn
   where convert(varchar(4),录入日期,23)=convert(varchar(4),getdate(),23)
   group by convert(varchar(7),录入日期,23)) t
 left join
(select '月份'=convert(varchar(7),录入日期,23),
            '产量'=sum(产量)
   from sn
   where convert(varchar(4),录入日期,23)=convert(varchar(4),dateadd(yyyy,-1,getdate()),23) 
   group by convert(varchar(7),录入日期,23)) u on right(t.月份,2)=right(u.月份,2)
取日期中的年份和月份 进行分组查询
(2015数据)left join (2016数据) 关联条件 月份相同

^_^ 如果您热爱技术、热爱编程,想与更多的朋友一起交流学习,欢迎加入本站官方QQ群:345733473 ^_^