求一语句!!

koukoujiayi 2009-06-02 05:12:00
请教大虾!!非常感谢!!
表ITEM
CALL_NO IN_DATE
A00001 2005
A00001 2006
A00001 2006
A00001 2006
A00001 2007
A00001 2007
A00001 2008
A00001 2008
A00001 2009
A00002 2006
A00002 2006
A00002 2007
A00002 2008
A00002 2009
A00003 2006
A00003 2007
A00003 2007
A00004 2005
A00004 2005
A00005 2009
A00005 2009
B00001
C00001
............

输入2007,想获得

类 2007(种数) 2007(数量) 截至上年总的(种数) 截至上年总的(数量) 截至当前年总的(种数) 截至当前年总的(数量)
A 3 5 4 9 5 21
B.......
C.......

注: 截至上年是指输入的2007-1年;截至当前年就是指本年度2009年

...全文
296 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
sysuzzj 2009-06-03
  • 打赏
  • 举报
回复

create procedure select_year @year int
as
select
left(CALL_NO,1) as 类型,
count(distinct case IN_DATE when @year then CALL_NO end) as [2007(种数)],
sum(case IN_DATE when @year then 1 else 0 end) as [2007(数量)],
count(distinct case when IN_DATE<@year then CALL_NO end) as [截至上年总的(种数)],
sum(case when IN_DATE<@year-1 then 1 else 0 end) as [截至上年总的(数量)],
count(distinct case when IN_DATE<=year(getdate()) then CALL_NO end) as [截至当前年总的(种数)],
sum(case when IN_DATE<=year(getdate()) then 1 else 0 end) as [截至当前年总的(数量)]
from
ITEM
group by
left(CALL_NO,1)
go
exec select_year 2007
子陌红尘 2009-06-03
  • 打赏
  • 举报
回复
明白楼主的意图了,后面四列都是求截止某个年份,也就是把之前的年份都统计上,修改一下:


create table ITEM(CALL_NO varchar(10),IN_DATE int)
insert into ITEM select 'A00001',2005
insert into ITEM select 'A00001',2006
insert into ITEM select 'A00001',2006
insert into ITEM select 'A00001',2006
insert into ITEM select 'A00001',2007
insert into ITEM select 'A00001',2007
insert into ITEM select 'A00001',2008
insert into ITEM select 'A00001',2008
insert into ITEM select 'A00001',2009
insert into ITEM select 'A00002',2006
insert into ITEM select 'A00002',2006
insert into ITEM select 'A00002',2007
insert into ITEM select 'A00002',2008
insert into ITEM select 'A00002',2009
insert into ITEM select 'A00003',2006
insert into ITEM select 'A00003',2007
insert into ITEM select 'A00003',2007
insert into ITEM select 'A00004',2005
insert into ITEM select 'A00004',2005
insert into ITEM select 'A00005',2009
insert into ITEM select 'A00005',2009
go

declare @year int
set @year=2007

select
left(CALL_NO,1) as 类型,
count(distinct case IN_DATE when @year then CALL_NO end) as [2007(种数)],
sum(case IN_DATE when @year then 1 else 0 end) as [2007(数量)],
count(distinct case when IN_DATE<@year then CALL_NO end) as [截至上年总的(种数)],
sum(case when IN_DATE<@year-1 then 1 else 0 end) as [截至上年总的(数量)],
count(distinct case when IN_DATE<=year(getdate()) then CALL_NO end) as [截至当前年总的(种数)],
sum(case when IN_DATE<=year(getdate()) then 1 else 0 end) as [截至当前年总的(数量)]
from
ITEM
group by
left(CALL_NO,1)
go

/*
类型 2007(种数) 2007(数量) 截至上年总的(种数) 截至上年总的(数量) 截至当前年总的(种数) 截至当前年总的(数量)
---- ----------- ----------- ----------- ----------- ----------- -----------
A 3 5 4 3 5 21
*/

drop table ITEM
go
feixianxxx 2009-06-03
  • 打赏
  • 举报
回复
慢估计是慢在统计总和 ~~ 具体只能等高手啦。。。。
koukoujiayi 2009-06-03
  • 打赏
  • 举报
回复
非常感谢楼上各位!!
测试了17楼钻钻的代码!速度和9楼一样,12秒左右!!
只好放弃了,现在分三次统计,然后合并,因为最多26个字母,26条记录,
这样一来分开统计,速度是可接受的5秒左右,就是代码多了点!!
再次感谢各位!!加100分!!
usher_gml 2009-06-03
  • 打赏
  • 举报
回复
全是高手...
cch1010 2009-06-03
  • 打赏
  • 举报
回复
学习
--小F-- 2009-06-03
  • 打赏
  • 举报
回复
进来仰望大侠
koukoujiayi 2009-06-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 feixianxxx 的回复:]
结果不对么?
[/Quote]
你提供的结果是对的!!但速度太慢了!!有没有其他方法??
feixianxxx 2009-06-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 koukoujiayi 的回复:]
钻钻的很好啊
[/Quote]
结果不对哦!!
[/Quote]

结果不对么?
koukoujiayi 2009-06-02
  • 打赏
  • 举报
回复
钻钻的很好啊
[/Quote]
结果不对哦!!
nalnait 2009-06-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 koukoujiayi 的回复:]
9楼结果完全正确,谢谢!!
问题是速度非常慢!!在sql查询分析器中测试12秒种左右,(数据量目前是10多万条)
这个速度可能不行!!!!
有没有可改进的地方??
[/Quote]
钻钻的很好啊
koukoujiayi 2009-06-02
  • 打赏
  • 举报
回复
9楼结果完全正确,谢谢!!
问题是速度非常慢!!在sql查询分析器中测试12秒种左右,(数据量目前是10多万条)
这个速度可能不行!!!!
有没有可改进的地方??
hwhunter 2009-06-02
  • 打赏
  • 举报
回复
table ITEM(CALL_NO varchar(10),IN_DATE int)
insert into ITEM select 'A00001',2005
insert into ITEM select 'A00001',2006
insert into ITEM select 'A00001',2006
insert into ITEM select 'A00001',2006
insert into ITEM select 'A00001',2007
insert into ITEM select 'A00001',2007
insert into ITEM select 'A00001',2008
insert into ITEM select 'A00001',2008
insert into ITEM select 'A00001',2009
insert into ITEM select 'A00002',2006
insert into ITEM select 'A00002',2006
insert into ITEM select 'A00002',2007
insert into ITEM select 'A00002',2008
insert into ITEM select 'A00002',2009
insert into ITEM select 'A00003',2006
insert into ITEM select 'A00003',2007
insert into ITEM select 'A00003',2007
insert into ITEM select 'A00004',2005
insert into ITEM select 'A00004',2005
insert into ITEM select 'A00005',2009
insert into ITEM select 'A00005',2009
go

declare @year int
feixianxxx 2009-06-02
  • 打赏
  • 举报
回复

create table ITEM(CALL_NO varchar(10),IN_DATE int)
insert into ITEM select 'A00001',2005
insert into ITEM select 'A00001',2006
insert into ITEM select 'A00001',2006
insert into ITEM select 'A00001',2006
insert into ITEM select 'A00001',2007
insert into ITEM select 'A00001',2007
insert into ITEM select 'A00001',2008
insert into ITEM select 'A00001',2008
insert into ITEM select 'A00001',2009
insert into ITEM select 'A00002',2006
insert into ITEM select 'A00002',2006
insert into ITEM select 'A00002',2007
insert into ITEM select 'A00002',2008
insert into ITEM select 'A00002',2009
insert into ITEM select 'A00003',2006
insert into ITEM select 'A00003',2007
insert into ITEM select 'A00003',2007
insert into ITEM select 'A00004',2005
insert into ITEM select 'A00004',2005
insert into ITEM select 'A00005',2009
insert into ITEM select 'A00005',2009
insert into ITEM select 'B00001',2008
insert into ITEM select 'B00002',2007
insert into ITEM select 'B00002',2008
insert into ITEM select 'C00001',2007
go

declare @year int
set @year=2010

select
left(CALL_NO,1)as 种类,
count(distinct case IN_DATE when @year then CALL_NO end) as 种数,
sum(case in_date when @year then 1 else 0 end)as 的数量,
count(distinct case when IN_DATE<@year then call_no end) as 截止上年的种数,
sum(case when in_date <@year then 1 else 0 end ) as 截止上年的数量,
count (distinct case when in_date <=year(getdate()) then call_no end) AS 截至当前年总的种树,
sum(case when IN_DATE <= year(getdate()) then 1 else 0 end) 截至当前年总的数量
from
ITEM
group by
left(CALL_NO,1)

结果:
A 0 0 5 21 5 21
B 0 0 2 3 2 3
C 0 0 1 1 1 1
koukoujiayi 2009-06-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 libin_ftsafe 的回复:]
SQL codeselect
left(CALL_NO,1),
count(distinct case IN_DATE when @year then CALL_NO end) ,
sum(case IN_DATE when @year then 1 else 0 end),
count(distinct case IN_DATE when @year-1 then CALL_NO end),
sum(case IN_DATE when @year-1 then 1 else 0 end),
isnull(count(distinct case IN_DATE when year(getdate()) then CALL_NO end),0),
sum(case IN_DATE when year(getdate(…
[/Quote]
将日期设置为2010,最后两列还是为零!!
望指教!!谢谢!!
子陌红尘 2009-06-02
  • 打赏
  • 举报
回复
select 
left(CALL_NO,1),
count(distinct case IN_DATE when @year then CALL_NO end) ,
sum(case IN_DATE when @year then 1 else 0 end),
count(distinct case IN_DATE when @year-1 then CALL_NO end),
sum(case IN_DATE when @year-1 then 1 else 0 end),
isnull(count(distinct case IN_DATE when year(getdate()) then CALL_NO end),0),
sum(case IN_DATE when year(getdate()) then 1 else 0 end)
from
ITEM
group by
left(CALL_NO,1)
koukoujiayi 2009-06-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liangCK 的回复:]
种数,数量是什么?
[/Quote]
种数:是相同的CALL_NO记录
数量:是CALL_NO第一个字母相同的记录
koukoujiayi 2009-06-02
  • 打赏
  • 举报
回复
谢谢楼上诸位!!
3楼大虾的有点问题哦!!
即如果现在是2010年,而表中无2010年记录,则最后两列均为零!!
望指教!!谢谢!!
lg3605119 2009-06-02
  • 打赏
  • 举报
回复

create table ITEM(CALL_NO varchar(10),IN_DATE int)
insert into ITEM select 'A00001',2005
insert into ITEM select 'A00001',2006
insert into ITEM select 'A00001',2006
insert into ITEM select 'A00001',2006
insert into ITEM select 'A00001',2007
insert into ITEM select 'A00001',2007
insert into ITEM select 'A00001',2008
insert into ITEM select 'A00001',2008
insert into ITEM select 'A00001',2009
insert into ITEM select 'A00002',2006
insert into ITEM select 'A00002',2006
insert into ITEM select 'A00002',2007
insert into ITEM select 'A00002',2008
insert into ITEM select 'A00002',2009
insert into ITEM select 'A00003',2006
insert into ITEM select 'A00003',2007
insert into ITEM select 'A00003',2007
insert into ITEM select 'A00004',2005
insert into ITEM select 'A00004',2005
insert into ITEM select 'A00005',2009
insert into ITEM select 'A00005',2009
go

declare @year int
set @year=2007

select
left(CALL_NO,1),
count(distinct case IN_DATE when @year then CALL_NO end) ,
sum(case IN_DATE when @year then 1 else 0 end),
count(distinct case when IN_DATE<=@year-1 then CALL_NO end),
sum(case when IN_DATE <=@year-1 then 1 else 0 end),
count(distinct case when IN_DATE<=year(getdate()) then CALL_NO end),
sum(case when IN_DATE <= year(getdate()) then 1 else 0 end)
from
ITEM
group by
left(CALL_NO,1)
go

/*
A 3 5 4 9 5 21
*/
drop table ITEM
go
子陌红尘 2009-06-02
  • 打赏
  • 举报
回复
create table ITEM(CALL_NO varchar(10),IN_DATE int)
insert into ITEM select 'A00001',2005
insert into ITEM select 'A00001',2006
insert into ITEM select 'A00001',2006
insert into ITEM select 'A00001',2006
insert into ITEM select 'A00001',2007
insert into ITEM select 'A00001',2007
insert into ITEM select 'A00001',2008
insert into ITEM select 'A00001',2008
insert into ITEM select 'A00001',2009
insert into ITEM select 'A00002',2006
insert into ITEM select 'A00002',2006
insert into ITEM select 'A00002',2007
insert into ITEM select 'A00002',2008
insert into ITEM select 'A00002',2009
insert into ITEM select 'A00003',2006
insert into ITEM select 'A00003',2007
insert into ITEM select 'A00003',2007
insert into ITEM select 'A00004',2005
insert into ITEM select 'A00004',2005
insert into ITEM select 'A00005',2009
insert into ITEM select 'A00005',2009
go

declare @year int
set @year=2007

select
left(CALL_NO,1),
count(distinct case IN_DATE when @year then CALL_NO end) ,
sum(case IN_DATE when @year then 1 else 0 end),
count(distinct case IN_DATE when @year-1 then CALL_NO end),
sum(case IN_DATE when @year-1 then 1 else 0 end),
count(distinct case IN_DATE when year(getdate()) then CALL_NO end),
sum(case IN_DATE when year(getdate()) then 1 else 0 end)
from
ITEM
group by
left(CALL_NO,1)
go

drop table ITEM
go
加载更多回复(2)
JavaScript核心技术 简介: 《JavaScript核心技术》对于各种浏览器、浏览器版本、JavaScript版本、DOM版本的介绍,有助于我们理解所遇到的各种新旧代码,使我们能够对这些代码做出正确的取舍。《JavaScript核心技术》还提供了一些使用JavaScript的最佳实践。无论是新手还是老手,这些如何正确使用JavaScript的经验都能帮助他们养成良好的编程习惯。《JavaScript核心技术》还介绍了一些调试和开发JavaScript的工具,这些工具无疑能够提高我们的开发效率。 《JavaScript核心技术》最后对于Ajax和几个流行的JavaScript库的介绍,无疑会开阔我们在JavaScript使用上的思路。 《JavaScript核心技术》是一本真正意义上的“新书”,不仅介绍了最新的JavaScript知识和方向,还完全覆盖了当今Web开发中关于JavaScript的所有重要话题,它使用了大量实例代码,图文并茂地讲解了使用JavaScript的各个层次和领域的内容。它不是一本参考手册,但却是一本值得拥有的教程。 JavaScript核心技术 目录: 前言 第1章JavaScript初探 1.1规范和实现相互交织的历史 1.2跨浏览器的不兼容性和其他常见的JavaScript传说 1.3你能用JavaScript来做什么 1.4JavaScript初探:“HelloWorld!” 1.5JavaScript沙箱 1.6可访问性和JavaScript的最佳实践 第2章JavaScript数据类型与变量 2.1变量的标识 2.2作用域 2.3简单类型 2.4常量:有名称但不改变 2.5习题 第3章运算符和语句 3.1JavaScript语句的格式 3.2简单语句 3.3条件语句和程序流 3.4条件运算符 3.5逻辑运算符 3.6高级语句:循环语句 3.7习题 第4章JavaScript对象 4.1对象构造函数 4.2Number对象 4.3String对象 4.4正则表达式与RegExp 4.5有专门用途的对象:Date和Math 4.6JavaScript数组 4.7关联数组:不是数组的数组 4.8习题 第5章函数 5.1定义函数:细数所有方式 5.2回调函数 5.3函数和递归 5.4嵌套函数、函数闭包和内存泄漏 5.5作为对象的函数 5.6习题 第6章捕捉事件 6.1O级DOM上的事件句柄 6.22级DOM上的事件句柄 6.3产生事件 6.4习题 第7章表单与即时验证 7.1访问表单 7.2把事件附加在表单上:不同的方法 7.3选择列表 7.4单选按钮和复选框 7.5输入字段和JiT正则表达式 7.6习题 第8章沙箱及之上的cookie、连通性和隐私 第9章基础浏览器对象 第10章DOM:文档对象模型 第11章创建定制的JavaScript对象 第12章构建动态网页:在脚本中加入样式 第13章使用Ajax 第14章好消息:生动的程序库!令人惊异的Web服务!有趣的API! 附录习题答案

34,872

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧