求一答案,不胜感谢!!

koukoujiayi 2009-06-07 06:25:10
表:
create table ITEM(DOC_TYPE_CODE varchar(2),CALL_NO varchar(10),IN_YEAR int)
insert into ITEM select '01','A00001',2008
insert into ITEM select '01','A00001',2008
insert into ITEM select '01','A00001',2009
insert into ITEM select '01','A00001',2009
insert into ITEM select '01','A00001',2009
insert into ITEM select '01','A00002',2008
insert into ITEM select '01','A00002',2008
insert into ITEM select '01','A00002',2008
insert into ITEM select '01','A00002',2009
insert into ITEM select '01','A00002',2009
insert into ITEM select '01','A00002',2009
insert into ITEM select '01','A00002',2009
insert into ITEM select '01','A00003',2008
insert into ITEM select '01','A00003',2009
insert into ITEM select '01','A00003',2009
insert into ITEM select '01','A00004',2009
insert into ITEM select '01','B00001',2008
insert into ITEM select '01','B00001',2008
insert into ITEM select '01','B00001',2009
insert into ITEM select '01','B00001',2009
insert into ITEM select '01','B00002',2007
insert into ITEM select '01','B00002',2009
insert into ITEM select '01','C00005',2007
insert into ITEM select '01','C00005',2008
insert into ITEM select '01','C00005',2009
insert into ITEM select '02','A00001',2008
insert into ITEM select '02','A00001',2009
insert into ITEM select '02','A00001',2009
insert into ITEM select '02','A00002',2008
insert into ITEM select '02','A00002',2008
insert into ITEM select '02','A00002',2009
insert into ITEM select '02','A00003',2008
insert into ITEM select '02','A00003',2009
insert into ITEM select '02','B00001',2008
insert into ITEM select '02','B00001',2008
insert into ITEM select '02','B00001',2009
insert into ITEM select '02','B00002',2009
insert into ITEM select '02','C00005',2008
insert into ITEM select '02','C00005',2009
go

参考网上建了一个存储过程:
CREATE proc Pr_100
@lendDate1 varchar(4),
@lendDate2 varchar(4)
AS
DECLARE @SQL VARCHAR(5000)
SET @SQL='SELECT UPPER(substring(CALL_NO,1,1)) as KIND'
SELECT @SQL= @SQL+ ',sum(CASE WHEN DOC_TYPE_CODE = '''+DOC_TYPE_CODE+''' THEN 1 else 0 END) ['+DOC_TYPE_CODE+']'
FROM (SELECT DISTINCT DOC_TYPE_CODE FROM Item ) as A ORDER BY DOC_TYPE_CODE
SET @SQL=@SQL+' FROM Item
WHERE (IN_YEAR BETWEEN '''+@lendDate1+''' AND '''+@lendDate2+''' )
GROUP BY UPPER(substring(CALL_NO,1,1))
ORDER BY UPPER(substring(CALL_NO,1,1)) '
exec (@SQL)

执行1:
Pr_100 '2009','2009'
结果1:
KIND 01 02
A 10 4
B 3 2
C 1 1
意思是:IN_YEAR为2009年,DOC_TYPE_CODE为 01,CALL_NO第一个字母为A的数量为9,其它类推,

执行2:
Pr_100 '2008','2009'
结果2:
KIND 01 02
A 16 8
B 5 4
C 2 2
意思是:IN_YEAR为2008年-2009年,DOC_TYPE_CODE为 01,CALL_NO第一个字母为A的数量为9,其它类推,

其中A,B,C及01,02是动态的,有D,E,F,03,04,05....等等,

问题的铺垫比较长,望大虾先能拨冗看一看!!
我的问题是得到数量的同时希望能得到"种数",所谓"种数"就是在相同的IN_YEAR,但CALL_NO不相同的数量,
例如
2009,DOC_TYPE_CODE为 01的有A00001,A00002,A00003,A00004,这就是4种,数量是9,因为都是A开头
2009,DOC_TYPE_CODE为 02的只有A00001,A00002,A00003,这就是3种,数量是4

以结果1为例,希望得到:
KIND 01 02 01种数 02种数
A 9 4 4 3
B 3 2 .........
C 1 1 .........

如果困难的话,分开为两个表也可以!!
不知道讲清楚了没有?
望大虾指教,小弟不胜感谢!!
...全文
100 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
claro 2009-06-07
  • 打赏
  • 举报
回复
帮顶
王向飞 2009-06-07
  • 打赏
  • 举报
回复
mark
ai_li7758521 2009-06-07
  • 打赏
  • 举报
回复
CREATE  proc Pr_100 
@lendDate1 varchar(4),
@lendDate2 varchar(4)
AS
DECLARE @SQL VARCHAR(5000)
SET @SQL='SELECT UPPER(left(call_no,1)) as KIND'
SELECT @SQL= @SQL+ ',sum(CASE WHEN DOC_TYPE_CODE = '''+DOC_TYPE_CODE+''' THEN 1 else 0 END) ['+DOC_TYPE_CODE+'],['+
DOC_TYPE_CODE+'总数]=count(distinct case when DOC_TYPE_CODE='''+DOC_TYPE_CODE+''' then call_no end)'
FROM (SELECT DISTINCT DOC_TYPE_CODE FROM Item ) as A ORDER BY DOC_TYPE_CODE
SET @SQL=@SQL+' FROM (SELECT * from item where IN_YEAR BETWEEN '''+@lendDate1+''' AND '''+@lendDate2+''' ) X
GROUP BY UPPER(left(call_no,1))
ORDER BY UPPER(left(call_no,1)) '
EXEC (@SQL)


Pr_100 '2009','2009'

KIND 01 01总数 02 02总数
---- ----------- ----------- ----------- -----------
A 10 4 4 3
B 3 2 2 2
C 1 1 1 1
(3 行受影响)

Pr_100 '2008','2009'

KIND 01 01总数 02 02总数
---- ----------- ----------- ----------- -----------
A 16 4 8 3
B 5 2 4 2
C 2 1 2 1
(3 行受影响)
ai_li7758521 2009-06-07
  • 打赏
  • 举报
回复
学习
ChinaJiaBing 2009-06-07
  • 打赏
  • 举报
回复
像这样..

if object_id('item')is not null
drop table item
if object_id('pr_100') is not null
drop procedure pr_100
create table ITEM(DOC_TYPE_CODE varchar(2),CALL_NO varchar(10),IN_YEAR int)
insert into ITEM select '01','A00001',2008
insert into ITEM select '01','A00001',2008
insert into ITEM select '01','A00001',2009
insert into ITEM select '01','A00001',2009
insert into ITEM select '01','A00001',2009
insert into ITEM select '01','A00002',2008
insert into ITEM select '01','A00002',2008
insert into ITEM select '01','A00002',2008
insert into ITEM select '01','A00002',2009
insert into ITEM select '01','A00002',2009
insert into ITEM select '01','A00002',2009
insert into ITEM select '01','A00002',2009
insert into ITEM select '01','A00003',2008
insert into ITEM select '01','A00003',2009
insert into ITEM select '01','A00003',2009
insert into ITEM select '01','A00004',2009
insert into ITEM select '01','B00001',2008
insert into ITEM select '01','B00001',2008
insert into ITEM select '01','B00001',2009
insert into ITEM select '01','B00001',2009
insert into ITEM select '01','B00002',2007
insert into ITEM select '01','B00002',2009
insert into ITEM select '01','C00005',2007
insert into ITEM select '01','C00005',2008
insert into ITEM select '01','C00005',2009
insert into ITEM select '02','A00001',2008
insert into ITEM select '02','A00001',2009
insert into ITEM select '02','A00001',2009
insert into ITEM select '02','A00002',2008
insert into ITEM select '02','A00002',2008
insert into ITEM select '02','A00002',2009
insert into ITEM select '02','A00003',2008
insert into ITEM select '02','A00003',2009
insert into ITEM select '02','B00001',2008
insert into ITEM select '02','B00001',2008
insert into ITEM select '02','B00001',2009
insert into ITEM select '02','B00002',2009
insert into ITEM select '02','C00005',2008
insert into ITEM select '02','C00005',2009
go
create proc pr_100
@lendDate1 varchar(4),
@lendDate2 varchar(4)
as
set nocount on
select * from (select DOC_TYPE_CODE,LEFT(CALL_NO,1) call_no,in_year from ITEM where IN_YEAR between @lendDate1 and @lendDate2) a pivot (count(in_year) for DOC_TYPE_CODE in ([01],[02])) b
set nocount off
go
exec pr_100 '2009','2009'
exec pr_100 '2008','2009'


1 行受影响)

(1 行受影响)
call_no 01 02
------- ----------- -----------
A 10 4
B 3 2
C 1 1

call_no 01 02
------- ----------- -----------
A 16 8
B 5 4
C 2 2


koukoujiayi 2009-06-07
  • 打赏
  • 举报
回复
4楼统计的,数据不对哦!!!
koukoujiayi 2009-06-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jiangshun 的回复:]
SQL codedeclare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename(DOC_TYPE_CODE)+'=sum(case when DOC_TYPE_CODE='''+DOC_TYPE_CODE+''' then 1 else 0 end),['+
DOC_TYPE_CODE+'总数]=count(distinct case when DOC_TYPE_CODE='''+DOC_TYPE_CODE+''' then 1 else 0 end)'
from item group by DOC_TYPE_CODE
exec('select CALL_NO=left(CALL_NO,1) '+@s+' from item group by left(CALL_NO,1)')

/*
CALL_NO …
[/Quote]
这个语句没搞懂!!where 加在那里??望指教!!!
koukoujiayi 2009-06-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 HEROWANG 的回复:]
SQL codeselect kind=left(call_no,1),[01]=sum(case when DOC_TYPE_CODE ='01' then 1 else 0 end),
[02]=sum(case when DOC_TYPE_CODE ='02' then 1 else 0 end),
[01种数]= count(distinct case when DOC_TYPE_CODE ='01' then call_no end) ,
[02种数]= count(distinct case when DOC_TYPE_CODE ='02' then call_no end)
from (select * from item where IN_YEAR='2009')K
group by left(ca…
[/Quote]
将01,02写死了,这个是动态的可能有03,04等等!!
jiangshun 2009-06-07
  • 打赏
  • 举报
回复
declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename(DOC_TYPE_CODE)+'=sum(case when DOC_TYPE_CODE='''+DOC_TYPE_CODE+''' then 1 else 0 end),['+
DOC_TYPE_CODE+'总数]=count(distinct case when DOC_TYPE_CODE='''+DOC_TYPE_CODE+''' then 1 else 0 end)'
from item group by DOC_TYPE_CODE
exec('select CALL_NO=left(CALL_NO,1) '+@s+' from item group by left(CALL_NO,1)')

/*
CALL_NO 01 01总数 02 02总数
------- ----------- ----------- ----------- -----------
A 16 2 8 2
B 6 2 4 2
C 3 2 2 2


*/

--自己加条件
  • 打赏
  • 举报
回复
select kind=left(call_no,1),[01]=sum(case when DOC_TYPE_CODE ='01' then 1 else 0 end),
[02]=sum(case when DOC_TYPE_CODE ='02' then 1 else 0 end),
[01种数]= count(distinct case when DOC_TYPE_CODE ='01' then call_no end) ,
[02种数]= count(distinct case when DOC_TYPE_CODE ='02' then call_no end)
from (select * from item where IN_YEAR='2009')K
group by left(call_no,1)

kind 01 02 01种数 02种数
A 10 4 4 3
B 3 2 2 2
C 1 1 1 1
koukoujiayi 2009-06-07
  • 打赏
  • 举报
回复
抱歉贴子有错,更正如下:
执行1:
Pr_100 '2009','2009'
结果1:
KIND 01 02
A 10 4
B 3 2
C 1 1
意思是:IN_YEAR为2009年,DOC_TYPE_CODE为 01,CALL_NO第一个字母为A的数量为10,其它类推,

执行2:
Pr_100 '2008','2009'
结果2:
KIND 01 02
A 16 8
B 5 4
C 2 2
意思是:IN_YEAR为2008年-2009年,DOC_TYPE_CODE为 01,CALL_NO第一个字母为A的数量为16,其它类推,

其中A,B,C及01,02是动态的,有D,E,F,03,04,05....等等,

问题的铺垫比较长,望大虾先能拨冗看一看!!
我的问题是得到数量的同时希望能得到"种数",所谓"种数"就是在相同的IN_YEAR,但CALL_NO不相同的数量,
例如
2009,DOC_TYPE_CODE为 01的有A00001,A00002,A00003,A00004,这就是4种,数量是10,因为都是A开头
2009,DOC_TYPE_CODE为 02的只有A00001,A00002,A00003,这就是3种,数量是4

以结果1为例,希望得到:
KIND 01 02 01种数 02种数
A 10 4 4 3
B 3 2 .........
C 1 1 .........

如果困难的话,分开为两个表也可以!!
不知道讲清楚了没有?
望大虾指教,小弟不胜感谢!!
  • 打赏
  • 举报
回复
这长,先mark下,再看看

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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