首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

还是刚才的有关问题,要在输出数据加上 平均数 的分析,请 tntzbzc,roy_88.继续领分

2012-01-21 
还是刚才的问题,要在输出数据加上平均数的分析,请 tntzbzc,roy_88...继续领分以下问题本在以下地址解决,但

还是刚才的问题,要在输出数据加上 平均数 的分析,请 tntzbzc,roy_88...继续领分
以下问题本在以下地址解决,但现增加一个     平均数     的分析指标.http://community.csdn.net/Expert/topic/5318/5318406.xml?temp=.9264337


cMain
-----------------------------------------
ClientID           ClientName         integral
-----------------------------------------
0001           sa                         1050.28
0002           li                         100.22
0003           liko                     135.00
0004           coco                     10000.52
0005           mico                     850.00
0006           IOTN                     10.00
0007           DSTI                     1280.00
0008           HOKU                     0.00
...更多记录


cLevel
-----------------------------------------
SpanBegin         SpanEnd           Level
-----------------------------------------
0                           100.00             E
100.01                 1000.00           D
1000.01               3000.00           C
3000.02               5000.00           B
5000.01               9999999.00     A
...分段不固定

说明:

两表由   cMain.integral     是否达到   cLevel.SpanBegin   ~     cLevel.SpanEnd     级别进行关联

Level               =   cMain.integral   达到       cLevel.SpanBegin   ~     cLevel.SpanEnd   对应的级别
Amount             =   达到某种级别的累计个数
Percentage     =   达到某种级别的累计个数       /       cMain的总记录个数
Avgintegral   =   达到某种级别的   integral   总和   /       达到某种级别的累计个数

输出:  
----------------------------------------
      Level       Amount       Avgintegral   Percentage
----------------------------------------
      A               1                 10000.52           12.50%
      B               0                 0.00                   0.00%
      C               2                 1165.14             25.00%
      D               3                 361.74               37.50%


      E               2                 5.00                   25.00%


在线等待ing...   先谢过了

[解决办法]

if object_id( 'pubs..cMain ') is not null
drop table cMain
go

create table cMain(
ClientID varchar(10),
ClientName varchar(10),
integral decimal(18,2))

insert into cMain(ClientID,ClientName,integral) values( '0001 ', 'sa ' , 1050.28)
insert into cMain(ClientID,ClientName,integral) values( '0002 ', 'li ' , 100.22)
insert into cMain(ClientID,ClientName,integral) values( '0003 ', 'liko ', 135.00)
insert into cMain(ClientID,ClientName,integral) values( '0004 ', 'coco ', 10000.52)
insert into cMain(ClientID,ClientName,integral) values( '0005 ', 'mico ', 850.00)
insert into cMain(ClientID,ClientName,integral) values( '0006 ', 'IOTN ', 10.00)
insert into cMain(ClientID,ClientName,integral) values( '0007 ', 'DSTI ', 1280.00)
insert into cMain(ClientID,ClientName,integral) values( '0008 ', 'HOKU ', 0.00)

if object_id( 'pubs..cLevel ') is not null
drop table cLevel
go

create table cLevel(
SpanBegin decimal(18,2),
SpanEnd decimal(18,2),
Level varchar(10))

insert into cLevel(SpanBegin,SpanEnd,Level) values(0 , 100.00 , 'E ')
insert into cLevel(SpanBegin,SpanEnd,Level) values(100.01 , 1000.00 , 'D ')
insert into cLevel(SpanBegin,SpanEnd,Level) values(1000.01, 3000.00 , 'C ')
insert into cLevel(SpanBegin,SpanEnd,Level) values(3000.02, 5000.00 , 'B ')
insert into cLevel(SpanBegin,SpanEnd,Level) values(5000.01, 9999999.00 , 'A ')

select clevel.level , isnull(q.amount,0) as amount , cast(isnull(q.integral,0.00) as decimal(18,2)) as Avgintegral , isnull(q.percentage, '0.00% ') as percentage from clevel
left join
(
select o.jb , o.amount , o.integral , cast(cast((cast(o.amount as decimal(18,2)) / p.amount) * 100 as decimal(18,2)) as varchar(10)) + '% ' as Percentage from
(
select n.jb , count(*) as amount,avg(n.integral) as integral from
(
select m.* from
(select cMain.* , case when cmain.integral > = clevel.spanbegin and cmain.integral <= clevel.spanend then cLevel.level end as jb
from cmain , clevel
) m
where jb is not null
) n
group by jb
) o ,
(select count(*) as amount from cmain) p
) q
on clevel.level = q.jb
order by clevel.level

drop table cLevel
drop table cMain


level amount Avgintegral percentage
---------- ----------- -------------------- -----------
A 1 10000.52 12.50%
B 0 .00 0.00%
C 2 1165.14 25.00%
D 3 361.74 37.50%
E 2 5.00 25.00%

(所影响的行数为 5 行)


[解决办法]
没分我照样来凑热闹~


SELECT [Level],AMOUNT,cast(Avgintegral as decimal(10,2)),
cast(cast(AMOUNT as float)/(SELECT COUNT(1) FROM #cMain)*100 as varchar(10))+ '% ' as Percentage from
(
SELECT [Level],


(SELECT COUNT(1) FROM #cMain WHERE INTEGRAL BETWEEN SPANBEGIN AND SPANEND) AS AMOUNT,
(SELECT isnull(avg(INTEGRAL),0) FROM #cMain WHERE INTEGRAL BETWEEN SPANBEGIN AND SPANEND) AS Avgintegral
FROM #cLevel
)t
order by [Level]
[解决办法]
create table cMain(ClientID int,ClientName varchar(20),integral dec(10,2))
insert cMain select 0001, 'sa ',1050.28
insert cMain select 0002, 'li ',100.22
insert cMain select 0003, 'liko ',135.00
insert cMain select 0004, 'coco ',10000.52
insert cMain select 0005, 'mico ',850.00
insert cMain select 0006, 'IOTN ',10.00
insert cMain select 0007, 'DSTI ',1280.00
insert cMain select 0008, 'HOKU ',0.00

create table cLevel(SpanBegin dec(10,2),SpanEnd dec(10,2),Level varchar(5))
insert cLevel select 0,100.00, 'E '
insert cLevel select 100.01,1000.00, 'D '
insert cLevel select 1000.01,3000.00, 'C '
insert cLevel select 3000.02,5000.00, 'B '
insert cLevel select 5000.01,9999999.00, 'A '


select Level,
(select count(*) from cMain where integral between a.SpanBegin and a.SpanEnd) Amout,
Avgintegral=isnull((select cast(avg(integral) as dec(10,2)) from cMain where integral between a.SpanBegin and a.SpanEnd),0.00),
rtrim(cast((select count(*) from cMain where integral between a.SpanBegin and a.SpanEnd)*1.0/(select count(*) cont from cMain where integral between (select min(SpanBegin) from cLevel) and (select max(SpanEnd) from cLevel) )*100 as dec(5,2)))+ '% ' Percentpage
from cLevel a

drop table cMain,cLevel


[解决办法]
declare @cMain table (ClientID varchar(10),ClientName varchar(10), integral float)
insert @cMain
select '0001 ', 'sa ',1050.28
union all select '0002 ', 'li ',100.22
union all select '0003 ', 'liko ',135.00
union all select '0004 ', 'coco ',10000.52
union all select '0005 ', 'mico ',850.00
union all select '0006 ', 'IOTN ',10.00
union all select '0007 ', 'DSTI ',1280.00
union all select '0008 ', 'HOKU ',0.00


declare @cLevel table (SpanBegin float, SpanEnd float, [Level] varchar(1))
insert @cLevel
select 0,100.00, 'E '
union all select 100.01,1000.00, 'D '
union all select 1000.01,3000.00, 'C '
union all select 3000.02,5000.00, 'B '
union all select 5000.01,9999999.00, 'A '
--改一下保留Avgintegral的两位小数
select [Level],Amount=(select count(1)from @cMain where integral between SpanBegin and SpanEnd)
,Avgintegral=(select cast(isnull(avg(integral),0)as decimal(15,2)) from @cMain where integral between SpanBegin and SpanEnd)--加一段avg平均值就行了
,Percentage=
(select rtrim(cast(cast(count(1)as decimal(15,2))/(select count(1)from @cMain)*100 as decimal(15,2)))+ '% '
from @cMain where integral between SpanBegin and SpanEnd)
from @cLevel order by Level

(所影响的行数为 8 行)


(所影响的行数为 5 行)

Level Amount Avgintegral Percentage
----- ----------- ----------------- -----------------------------------------
A 1 10000.52 12.50%
B 0 .00 0.00%
C 2 1165.14 25.00%
D 3 361.74 37.50%
E 2 5.00 25.00%

(所影响的行数为 5 行)

热点排行