当前位置: 代码迷 >> Sql Server >> 请问一行含字母与数字的多列数据求和
  详细解决方案

请问一行含字母与数字的多列数据求和

热度:49   发布时间:2016-04-24 20:02:31.0
请教一行含字母与数字的多列数据求和
本帖最后由 u012611754 于 2013-10-29 16:20:14 编辑

CREATE TABLE ats_test
  (
     empcode      NVARCHAR(40),
     Day_01       NVARCHAR(10),
     Day_02       NVARCHAR(10),
     Day_03       NVARCHAR(10),
     Day_04       NVARCHAR(10),
     Day_05       NVARCHAR(10),
     Day_06       NVARCHAR(10),
     Day_07       NVARCHAR(10),
     Day_08       NVARCHAR(10),
     Day_09       NVARCHAR(10),
     Day_10       NVARCHAR(10)
  ) 

insert into ats_test values ('EAA45463','N4/D2/S2','N4/D2/S2','L7.5','N7.5','N7.5','N7.5','N7.5','N7.5','N7.5','N7.5')
insert into ats_test values ('EAA81137','X','L8','L8','N7.5','N7.5','N7.5','X','X','X','N6.5')

求高手们指导下,如何统计一行数据中Day_01~Day_10列中第一个字母相同的数据的数字部分和?
其中比较特殊的是一个字段数据可以是'N4/D2/S2'
我想做个视图,对每个人做统计,统计信息的列名就为empcode、D、L、N、S、X

期望处理前样子:
empcode  | Day_01   | Day_02    | Day_03  | Day_04  | Day_05  | Day_06  | Day_07  | Day_08  | Day_09  | Day_10
EAA45463 | N4/D2/S2 | N4/D2/S2  | L7.5    | N7.5    | N7.5    | N7.5    | N7.5    | N7.5    | N7.5    | N7.5
EAA81137 | X        | L8        | L8      | N7.5    | N7.5    | N7.5    | X       | X       | X       | N6.5

处理后样子:
empcode   | D  | L    | N     | S  | X
EAA45463  | 4  | 7.5  | 60.5  | 4  | 0


------解决方案--------------------
CREATE TABLE ats_test
(
 empcode      NVARCHAR(40),
 Day_01       NVARCHAR(10),
 Day_02       NVARCHAR(10),
 Day_03       NVARCHAR(10),
 Day_04       NVARCHAR(10),
 Day_05       NVARCHAR(10),
 Day_06       NVARCHAR(10),
 Day_07       NVARCHAR(10),
 Day_08       NVARCHAR(10),
 Day_09       NVARCHAR(10),
 Day_10       NVARCHAR(10)

insert into ats_test values ('EAA45463','N4/D2/S2','N4/D2/S2','L7.5','N7.5','N7.5','N7.5','N7.5','N7.5','N7.5','N7.5')
insert into ats_test values ('EAA81137','X','L8','L8','N7.5','N7.5','N7.5','X','X','X','N6.5')
go 


;with cte as 
(
select empcode,Day_01 as [key] from ats_test
union all select empcode,Day_02 from ats_test
union all select empcode,Day_03 from ats_test
union all select empcode,Day_04 from ats_test
union all select empcode,Day_05 from ats_test
union all select empcode,Day_06 from ats_test
union all select empcode,Day_07 from ats_test
union all select empcode,Day_08 from ats_test
union all select empcode,Day_09 from ats_test
union all select empcode,Day_10 from ats_test
),
cte2 as
(
select empcode,left([key],1) as [key],STUFF([key],1,1,'') as num
from (
SELECT empcode, SUBSTRING([key],number,CHARINDEX('/',[key]+'/',number)-number) as [key]
from cte a, master..spt_values 
where [key] like '%/%' and number >=1 and type='p' 
and number<len([key])  and substring('/'+[key],number,1)='/'
union all
  相关解决方案