34,594
社区成员
发帖
与我相关
我的任务
分享
use Tempdb
go
--> --> 听雨停了-->生成测试数据
if not object_id(N'Tempdb..#tabA') is null
drop table #tabA
Go
Create table #tabA([项目] nvarchar(25),[分值列表] nvarchar(29))
Insert #tabA
select N'思想品德',N'15,10,-15' union all
select N'贡献与失误',N'15,10,-15' union all
select N'任务完成',N'15,13,10' union all
select N'出勤率',N'10,8,4' union all
select N'表达能力',N'8,6,4' union all
select N'团结协作',N'9,7,5' union all
select N'业务能力',N'8,6,4' union all
select N'工作态度',N'5,4,2' union all
select N'效率和质量',N'5,4,2' union all
select N'本人作用',N'5,4,2'
Go
Select * from #tabA
if not object_id(N'Tempdb..#tabB') is null
drop table #tabB
Go
Create table #tabB([姓名] nvarchar(23),[项目] nvarchar(25),[得分] nvarchar(21))
Insert #tabB
select N'安丰顺',N'思想品德',N'A' union all
select N'安丰顺',N'贡献与失误',N'B' union all
select N'安丰顺',N'任务完成',N'C' union all
select N'安丰顺',N'出勤率',N'C' union all
select N'安丰顺',N'表达能力',N'A' union all
select N'安丰顺',N'团结协作',N'A' union all
select N'安丰顺',N'业务能力',N'B' union all
select N'安丰顺',N'工作态度',N'C' union all
select N'安丰顺',N'效率和质量',N'C' union all
select N'安丰顺',N'本人作用',N'A' union all
select N'卞树明',N'思想品德',N'A' union all
select N'卞树明',N'贡献与失误',N'A' union all
select N'卞树明',N'任务完成',N'A' union all
select N'卞树明',N'出勤率',N'C' union all
select N'卞树明',N'表达能力',N'A' union all
select N'卞树明',N'团结协作',N'B' union all
select N'卞树明',N'业务能力',N'B' union all
select N'卞树明',N'工作态度',N'C' union all
select N'卞树明',N'效率和质量',N'A' union all
select N'卞树明',N'本人作用',N'C'
Go
Select * from #tabB
--测试数据结束
--创建字符串分割函数
CREATE FUNCTION [dbo].[f_splitSTR](
@s varchar(8000), --待分拆的字符串
@split varchar(10) --数据分隔符
)RETURNS @re TABLE(col varchar(100))
AS
BEGIN
DECLARE @splitlen int
SET @splitlen=LEN(@split+'a')-2
WHILE CHARINDEX(@split,@s)>0
BEGIN
INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))
SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')
END
INSERT @re VALUES(@s)
RETURN
END
--结果
;WITH cte AS (
SELECT 项目,
col,
CASE ROW_NUMBER() OVER(PARTITION BY 项目 ORDER BY 分值列表)
WHEN 1 THEN 'A'
WHEN 2 THEN 'B'
WHEN 3 THEN 'C'
END AS rn
FROM #taba a
OUTER APPLY ecs.dbo.f_splitSTR(
a.分值列表,',')
)
SELECT b.姓名,sum(cast(a.col as int)) as 总分 FROM cte AS a
INNER JOIN #tabB AS b ON a.项目=b.项目 and a.rn=b.得分
GROUP BY b.姓名
USE tempdb
GO
IF OBJECT_ID('ticket') IS NOT NULL DROP TABLE ticket
IF OBJECT_ID('score') IS NOT NULL DROP TABLE score
GO
CREATE TABLE ticket(project NVARCHAR(20),valueList VARCHAR(20))
CREATE TABLE score([name] NVARCHAR(10),project NVARCHAR(20), scoreNo VARCHAR(5))
GO
INSERT INTO ticket( project,valueList)
SELECT '思想品德','15,10,-15'
UNION ALL SELECT '贡献与失误','15,10,-15'
UNION ALL SELECT '任务完成','15,13,10'
UNION ALL SELECT '出勤率','10,8,4'
UNION ALL SELECT '表达能力','8,6,4'
UNION ALL SELECT '团结协作','9,7,5'
UNION ALL SELECT '业务能力','8,6,4'
UNION ALL SELECT '工作态度','5,4,2'
UNION ALL SELECT '效率和质量','5,4,2'
UNION ALL SELECT '本人作用','5,4,2'
INSERT INTO score(name,project,scoreNo)
SELECT '安丰顺','思想品德','A'
UNION ALL SELECT '安丰顺','贡献与失误','B'
UNION ALL SELECT '安丰顺','任务完成','C'
UNION ALL SELECT '安丰顺','出勤率','C'
UNION ALL SELECT '安丰顺','表达能力','A'
UNION ALL SELECT '安丰顺','团结协作','A'
UNION ALL SELECT '安丰顺','业务能力','B'
UNION ALL SELECT '安丰顺','工作态度','C'
UNION ALL SELECT '安丰顺','效率和质量','C'
UNION ALL SELECT '安丰顺','本人作用','A'
UNION ALL SELECT '卞树明','思想品德','A'
UNION ALL SELECT '卞树明','贡献与失误','A'
UNION ALL SELECT '卞树明','任务完成','A'
UNION ALL SELECT '卞树明','出勤率','C'
UNION ALL SELECT '卞树明','表达能力','A'
UNION ALL SELECT '卞树明','团结协作','B'
UNION ALL SELECT '卞树明','业务能力','B'
UNION ALL SELECT '卞树明','工作态度','C'
UNION ALL SELECT '卞树明','效率和质量','A'
UNION ALL SELECT '卞树明','本人作用','C'
SELECT s.name AS [姓名],
SUM(
CAST(
PARSENAME(REPLACE('15,10,-15',',','.'),
CASE WHEN s.scoreNo='C' THEN 1
WHEN s.scoreNo='B' THEN 2
WHEN s.scoreNo='A' THEN 3
END
)
AS INT)
) AS [总分]
FROM score s INNER JOIN ticket t ON s.project=t.project
GROUP BY s.name
/*
姓名 总分
安丰顺 20
卞树明 50
*/
USE tempdb
GO
IF OBJECT_ID('ticket') IS NOT NULL DROP TABLE ticket
IF OBJECT_ID('score') IS NOT NULL DROP TABLE score
GO
CREATE TABLE ticket(project NVARCHAR(20),valueList VARCHAR(20))
CREATE TABLE score([name] NVARCHAR(10),project NVARCHAR(20), scoreNo VARCHAR(5))
GO
INSERT INTO ticket( project,valueList)
SELECT '思想品德','15,10,-15'
UNION ALL SELECT '贡献与失误','15,10,-15'
UNION ALL SELECT '任务完成','15,13,10'
UNION ALL SELECT '出勤率','10,8,4'
UNION ALL SELECT '表达能力','8,6,4'
UNION ALL SELECT '团结协作','9,7,5'
UNION ALL SELECT '业务能力','8,6,4'
UNION ALL SELECT '工作态度','5,4,2'
UNION ALL SELECT '效率和质量','5,4,2'
UNION ALL SELECT '本人作用','5,4,2'
INSERT INTO score(name,project,scoreNo)
SELECT '安丰顺','思想品德','A'
UNION ALL SELECT '安丰顺','贡献与失误','B'
UNION ALL SELECT '安丰顺','任务完成','C'
UNION ALL SELECT '安丰顺','出勤率','C'
UNION ALL SELECT '安丰顺','表达能力','A'
UNION ALL SELECT '安丰顺','团结协作','A'
UNION ALL SELECT '安丰顺','业务能力','B'
UNION ALL SELECT '安丰顺','工作态度','C'
UNION ALL SELECT '安丰顺','效率和质量','C'
UNION ALL SELECT '安丰顺','本人作用','A'
UNION ALL SELECT '卞树明','思想品德','A'
UNION ALL SELECT '卞树明','贡献与失误','A'
UNION ALL SELECT '卞树明','任务完成','A'
UNION ALL SELECT '卞树明','出勤率','C'
UNION ALL SELECT '卞树明','表达能力','A'
UNION ALL SELECT '卞树明','团结协作','B'
UNION ALL SELECT '卞树明','业务能力','B'
UNION ALL SELECT '卞树明','工作态度','C'
UNION ALL SELECT '卞树明','效率和质量','A'
UNION ALL SELECT '卞树明','本人作用','C'
SELECT s.name AS [姓名],
SUM(
CAST(
PARSENAME(REPLACE(t.valueList,',','.'),
CASE WHEN s.scoreNo='C' THEN 1
WHEN s.scoreNo='B' THEN 2
WHEN s.scoreNo='A' THEN 3
END
)
AS INT)
) AS [总分]
FROM score s INNER JOIN ticket t ON s.project=t.project
GROUP BY s.name
/*
姓名 总分
安丰顺 71
卞树明 79
*/
SELECT s.name AS [姓名],
s.project AS [项目],
CAST(
PARSENAME(REPLACE(t.valueList,',','.'),
CASE WHEN s.scoreNo='C' THEN 1
WHEN s.scoreNo='B' THEN 2
WHEN s.scoreNo='A' THEN 3
END
)
AS INT) AS [单科分数]
FROM score s INNER JOIN ticket t ON s.project=t.project
ORDER BY s.name
/*
姓名 项目 单科分数
安丰顺 思想品德 15
安丰顺 贡献与失误 10
安丰顺 任务完成 10
安丰顺 出勤率 4
安丰顺 表达能力 8
安丰顺 团结协作 9
安丰顺 业务能力 6
安丰顺 工作态度 2
安丰顺 效率和质量 2
安丰顺 本人作用 5
卞树明 思想品德 15
卞树明 贡献与失误 15
卞树明 任务完成 15
卞树明 出勤率 4
卞树明 表达能力 8
卞树明 团结协作 7
卞树明 业务能力 6
卞树明 工作态度 2
卞树明 效率和质量 5
卞树明 本人作用 2
*/
ALTER FUNCTION dbo.F_Split
(
@SplitString nvarchar(max), --源字符串
@Separator nvarchar(10)=' ' --分隔符号,默认为空格
)
RETURNS @SplitStringsTable TABLE --输出的数据表
(
[id] int identity(1,1),
[value] nvarchar(max)
)
AS
BEGIN
DECLARE @CurrentIndex int;
DECLARE @NextIndex int;
DECLARE @ReturnText nvarchar(max);
SELECT @CurrentIndex=1;
WHILE(@CurrentIndex<=len(@SplitString))
BEGIN
SELECT @NextIndex=charindex(@Separator,@SplitString,@CurrentIndex);
IF(@NextIndex=0 OR @NextIndex IS NULL)
SELECT @NextIndex=len(@SplitString)+1;
SELECT @ReturnText=substring(@SplitString,@CurrentIndex,@NextIndex-@CurrentIndex);
INSERT INTO @SplitStringsTable([value]) VALUES(@ReturnText);
SELECT @CurrentIndex=@NextIndex+1;
END
RETURN;
END
GO
--测试数据
if not object_id(N'Tempdb..#Bill') is null
drop table #Bill
Go
Create table #Bill([项目] nvarchar(25),[分值列表] nvarchar(29))
Insert #Bill
select N'思想品德',N'15,10,-15' union all
select N'贡献与失误',N'15,10,-15' union all
select N'任务完成',N'15,13,10' union all
select N'出勤率',N'10,8,4' union all
select N'表达能力',N'8,6,4' union all
select N'团结协作',N'9,7,5' union all
select N'业务能力',N'8,6,4' union all
select N'工作态度',N'5,4,2' union all
select N'效率和质量',N'5,4,2' union all
select N'本人作用',N'5,4,2'
GO
if not object_id(N'Tempdb..#Project') is null
drop table #Project
Go
Create table #Project([姓名] nvarchar(23),[项目] nvarchar(25),[得分] nvarchar(21))
Insert #Project
select N'安丰顺',N'思想品德',N'A' union all
select N'安丰顺',N'贡献与失误',N'B' union all
select N'安丰顺',N'任务完成',N'C' union all
select N'安丰顺',N'出勤率',N'C' union all
select N'安丰顺',N'表达能力',N'A' union all
select N'安丰顺',N'团结协作',N'A' union all
select N'安丰顺',N'业务能力',N'B' union all
select N'安丰顺',N'工作态度',N'C' union all
select N'安丰顺',N'效率和质量',N'C' union all
select N'安丰顺',N'本人作用',N'A' union all
select N'卞树明',N'思想品德',N'A' union all
select N'卞树明',N'贡献与失误',N'A' union all
select N'卞树明',N'任务完成',N'A' union all
select N'卞树明',N'出勤率',N'C' union all
select N'卞树明',N'表达能力',N'A' union all
select N'卞树明',N'团结协作',N'B' union all
select N'卞树明',N'业务能力',N'B' union all
select N'卞树明',N'工作态度',N'C' union all
select N'卞树明',N'效率和质量',N'A' union all
select N'卞树明',N'本人作用',N'C'
Go
--测试数据结束
SELECT #Project.姓名 ,
( SELECT TOP 1
value
FROM dbo.F_Split(分值列表, ',') t
WHERE id = ( CASE WHEN 得分 = 'A' THEN 1
WHEN 得分 = 'B' THEN 2
ELSE 3
END )
) AS 总分
FROM #Project
JOIN #Bill ON #Project.项目 = #Bill.项目