如:A部门内有甲乙丙丁四位员工,
则 甲 需要对 甲乙,甲丙,甲丁,乙丙,乙丁,丙丁进行两两评价投票。
乙 则需要对 甲乙,甲丙,甲丁,乙丙,乙丁,丙丁……无需跨部门比较,自己不用跟自己对比。每次投票时,想通过一个储存过程,插入数据到评价表,然后投票人根据WorkID只投自己的选票。表达不清,见谅~表结构如下:
CREATE TABLE [dbo].[User]( --员工表
[UserID] [varchar](50) NOT NULL, --员工ID
[UserName] [varchar](50) NULL, --员工姓名
[UserOrg] [varchar](50) NULL) --部门
CREATE TABLE [dbo].[UserAssess]( --评价表
[AutoID] [varchar](50) NOT NULL, --自增长ID
[UserID_A] [varchar](50) NOT NULL, --评价对象A
[UserID_B] [varchar](50) NOT NULL, --评价对象B (A,B不能相同)
[WorkID] [varchar](50) NOT NULL, --投票人
[Result] [varchar](50) NULL) --评价结果测试数据:
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('AA','甲','工程部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('BB','乙','工程部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('CC','丙','工程部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('DD','丁','工程部')INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('EE','王','技术部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('FF','李','技术部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('HH','张','技术部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('II','刘','技术部')
则 甲 需要对 甲乙,甲丙,甲丁,乙丙,乙丁,丙丁进行两两评价投票。
乙 则需要对 甲乙,甲丙,甲丁,乙丙,乙丁,丙丁……无需跨部门比较,自己不用跟自己对比。每次投票时,想通过一个储存过程,插入数据到评价表,然后投票人根据WorkID只投自己的选票。表达不清,见谅~表结构如下:
CREATE TABLE [dbo].[User]( --员工表
[UserID] [varchar](50) NOT NULL, --员工ID
[UserName] [varchar](50) NULL, --员工姓名
[UserOrg] [varchar](50) NULL) --部门
CREATE TABLE [dbo].[UserAssess]( --评价表
[AutoID] [varchar](50) NOT NULL, --自增长ID
[UserID_A] [varchar](50) NOT NULL, --评价对象A
[UserID_B] [varchar](50) NOT NULL, --评价对象B (A,B不能相同)
[WorkID] [varchar](50) NOT NULL, --投票人
[Result] [varchar](50) NULL) --评价结果测试数据:
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('AA','甲','工程部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('BB','乙','工程部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('CC','丙','工程部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('DD','丁','工程部')INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('EE','王','技术部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('FF','李','技术部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('HH','张','技术部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('II','刘','技术部')
解决方案 »
- 请教:MSSQL 2005 Developer Edition性能上有什么限制?
- EXCEL批量导入修改SQL表中的特定字段的问题,比如“餐费”和“员工部门”
- 求UPDATE语句
- where ,on,having
- 做了一天了还差最后一步的sql语句求助
- sql 2005和sql 2008R2同时安装在同一电脑上
- Service Broker给ASP.net应用程序发送消息
- 链接ms sql错误,但是昨天才好的,今天不行了
- 菜鸟,求救!
- 如何在DB2的触发器中调用存储过程?(在线等待!!!)
- sqlserver2005 数据库优化database engine tuning advisor问题
- sql server 如何换行?
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('BB','乙','工程部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('CC','丙','工程部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('DD','丁','工程部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('EE','王','技术部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('FF','李','技术部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('HH','张','技术部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('II','刘','技术部')SELECT a.UserName+b.UserName FROM [User] a,[User] b
WHERE a.UserOrg=b.UserOrg AND a.UserName<>b.UserName
ORDER BY a.UserName
SELECT c.UserName+'→'+a.UserName+b.UserName AS x FROM [User] a,[User] b,[User] c
WHERE a.UserOrg=b.UserOrg
AND a.UserOrg=c.UserOrg
AND a.UserName<>b.UserName
ORDER BY x
/*
x
--------------------------------------------------------------------------------------------------------------------------------------------------------
丙→丙丁
丙→丙甲
丙→丙乙
丙→丁丙
丙→丁甲
丙→丁乙
丙→甲丙
丙→甲丁
丙→甲乙
丙→乙丙
丙→乙丁
丙→乙甲
丁→丙丁
丁→丙甲
丁→丙乙
丁→丁丙
丁→丁甲
丁→丁乙
丁→甲丙
丁→甲丁
丁→甲乙
丁→乙丙
丁→乙丁
丁→乙甲
甲→丙丁
甲→丙甲
甲→丙乙
甲→丁丙
甲→丁甲
甲→丁乙
甲→甲丙
甲→甲丁
甲→甲乙
甲→乙丙
甲→乙丁
甲→乙甲
李→李刘
李→李王
李→李张
李→刘李
李→刘王
李→刘张
李→王李
李→王刘
李→王张
李→张李
李→张刘
李→张王
刘→李刘
刘→李王
刘→李张
刘→刘李
刘→刘王
刘→刘张
刘→王李
刘→王刘
刘→王张
刘→张李
刘→张刘
刘→张王
王→李刘
王→李王
王→李张
王→刘李
王→刘王
王→刘张
王→王李
王→王刘
王→王张
王→张李
王→张刘
王→张王
乙→丙丁
乙→丙甲
乙→丙乙
乙→丁丙
乙→丁甲
乙→丁乙
乙→甲丙
乙→甲丁
乙→甲乙
乙→乙丙
乙→乙丁
乙→乙甲
张→李刘
张→李王
张→李张
张→刘李
张→刘王
张→刘张
张→王李
张→王刘
张→王张
张→张李
张→张刘
张→张王(96 行受影响)
*/
应该是这样的关系吧
查询写入来了,插入你自己修改一下吧 呵呵
CREATE TABLE [dbo].[User]( --员工表
[UserID] [varchar](50) NOT NULL, --员工ID
[UserName] [varchar](50) NULL, --员工姓名
[UserOrg] [varchar](50) NULL) --部门
CREATE TABLE [dbo].[UserAssess]( --评价表
[AutoID] [varchar](50) NOT NULL, --自增长ID
[UserID_A] [varchar](50) NOT NULL, --评价对象A
[UserID_B] [varchar](50) NOT NULL, --评价对象B (A,B不能相同)
[WorkID] [varchar](50) NOT NULL, --投票人
[Result] [varchar](50) NULL) --评价结果
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('AA','甲','工程部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('BB','乙','工程部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('CC','丙','工程部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('DD','丁','工程部')INSERT INTO [User](UserID,UserName,UserOrg) VALUES('EE','王','技术部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('FF','李','技术部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('HH','张','技术部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('II','刘','技术部')select
a.UserName+'->'+b.UserName+'and'+c.UserName as 比较结果
from
[User] a
inner join
[User] b
on
a.UserID<>b.UserID
and a.UserOrg=b.UserOrg
inner join
[User] c
on
a.UserID<>c.UserID
and a.UserOrg=c.UserOrg
where
a.UserID<>b.UserID
and a.UserID<c.UserID
/*
比较结果
甲->乙and乙
甲->丙and乙
甲->丁and乙
甲->乙and丙
甲->丙and丙
甲->丁and丙
甲->乙and丁
甲->丙and丁
甲->丁and丁
乙->甲and丙
乙->丙and丙
乙->丁and丙
乙->甲and丁
乙->丙and丁
乙->丁and丁
丙->甲and丁
丙->乙and丁
丙->丁and丁
王->李and李
王->张and李
王->刘and李
王->李and张
王->张and张
王->刘and张
王->李and刘
王->张and刘
王->刘and刘
李->王and张
李->张and张
李->刘and张
李->王and刘
李->张and刘
李->刘and刘
张->王and刘
张->李and刘
张->刘and刘
*/
CREATE TABLE [dbo].Sys_User( --员工表
[ID] int identity(1,1),
[UserID] [varchar](50) NOT NULL, --员工ID
[UserName] [varchar](50) NULL, --员工姓名
[UserOrg] [varchar](50) NULL) --部门
CREATE TABLE [dbo].[UserAssess]( --评价表
[AutoID] [varchar](50) NOT NULL, --自增长ID
[UserID_A] [varchar](50) NOT NULL, --评价对象A
[UserID_B] [varchar](50) NOT NULL, --评价对象B (A,B不能相同)
[WorkID] [varchar](50) NOT NULL, --投票人
[Result] [varchar](50) NULL) --评价结果
goset nocount on
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('AA','甲','工程部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('BB','乙','工程部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('CC','丙','工程部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('DD','丁','工程部')INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('EE','王','技术部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('FF','李','技术部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('HH','张','技术部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('II','刘','技术部')
set nocount off
go;with cte as
(
select a.id,a.username Am,b.username Bm,rid = row_number() over (order by getdate())
from sys_user a join sys_user b on a.userorg = b.userorg and a.userid <> b.userid
)select e.username + ':' + t.am + ' To ' + t.bm
from cte t join Sys_User e on t.id = e.id
where not exists (select 1 from cte where am = t.bm and bm = t.am and rid > t.rid)
order by e.iddrop table Sys_User,[UserAssess]/***************************甲:甲 To 丁
甲:甲 To 乙
甲:甲 To 丙
乙:乙 To 丙
乙:乙 To 丁
丙:丙 To 丁
王:王 To 李
王:王 To 张
王:王 To 刘
李:李 To 刘
李:李 To 张
张:张 To 刘(12 行受影响)
--我还以为同部门。;with cte as
(
select a.id,a.username Am,b.username Bm,rid = row_number() over (order by getdate())
from sys_user a join sys_user b on a.userid <> b.userid
)select e.username + ':' + t.am + ' To ' + t.bm
from cte t join Sys_User e on t.id = e.id
where not exists (select 1 from cte where am = t.bm and bm = t.am and rid > t.rid)
order by e.id/**************************甲:甲 To 丙
甲:甲 To 丁
甲:甲 To 李
甲:甲 To 刘
甲:甲 To 王
甲:甲 To 乙
甲:甲 To 张
乙:乙 To 丙
乙:乙 To 丁
乙:乙 To 李
乙:乙 To 刘
乙:乙 To 王
乙:乙 To 张
丙:丙 To 丁
丙:丙 To 李
丙:丙 To 刘
丙:丙 To 王
丙:丙 To 张
丁:丁 To 李
丁:丁 To 刘
丁:丁 To 王
丁:丁 To 张
王:王 To 李
王:王 To 刘
王:王 To 张
李:李 To 刘
李:李 To 张
张:张 To 刘(28 行受影响)
CREATE TABLE [dbo].[User]( --员工表
[UserID] [varchar](50) NOT NULL, --员工ID
[UserName] [varchar](50) NULL, --员工姓名
[UserOrg] [varchar](50) NULL) --部门
CREATE TABLE [dbo].[UserAssess]( --评价表
[AutoID] [varchar](50) NOT NULL, --自增长ID
[UserID_A] [varchar](50) NOT NULL, --评价对象A
[UserID_B] [varchar](50) NOT NULL, --评价对象B (A,B不能相同)
[WorkID] [varchar](50) NOT NULL, --投票人
[Result] [varchar](50) NULL) --评价结果
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('AA','甲','工程部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('BB','乙','工程部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('CC','丙','工程部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('DD','丁','工程部')INSERT INTO [User](UserID,UserName,UserOrg) VALUES('EE','王','技术部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('FF','李','技术部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('HH','张','技术部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('II','刘','技术部')select
a.UserName+'->'TT,
b.UserName+'and'+c.UserName as 比较结果
from
[User] a
inner join
[User] b
on
a.UserID<>b.UserID
and a.UserOrg=b.UserOrg
inner join
[User] c
on
a.UserID<>c.UserID
and a.UserOrg=c.UserOrg
where
a.UserID<>b.UserID
and a.UserID<>c.UserID
and b.UserID<>c.UserID
/*
比较结果
甲->丙and乙
甲->丁and乙
甲->乙and丙
甲->丁and丙
甲->乙and丁
甲->丙and丁
乙->丙and甲
乙->丁and甲
乙->甲and丙
乙->丁and丙
乙->甲and丁
乙->丙and丁
丙->乙and甲
丙->丁and甲
丙->甲and乙
丙->丁and乙
丙->甲and丁
丙->乙and丁
丁->乙and甲
丁->丙and甲
丁->甲and乙
丁->丙and乙
丁->甲and丙
丁->乙and丙
王->张and李
王->刘and李
王->李and张
王->刘and张
王->李and刘
王->张and刘
李->张and王
李->刘and王
李->王and张
李->刘and张
李->王and刘
李->张and刘
张->李and王
张->刘and王
张->王and李
张->刘and李
张->王and刘
张->李and刘
刘->李and王
刘->张and王
刘->王and李
刘->张and李
刘->王and张
刘->李and张
*/
if OBJECT_ID('proc_tp') is not null drop proc proc_tp
go
create proc proc_tp
@UserID varchar(50),
@UserOrg varchar(50)
as
begin
insert into [UserAssess]([UserID_A],[UserID_B],[WorkID],[Result])
select a.UserID UserID_A,b.UserID UserID_B,WorkID=@UserID,Result='评价结果' from [User] a
left join [User] b on a.UserID<b.UserID
where a.UserOrg=@UserOrg and b.UserOrg=@UserOrg
end
go
--调用存储过程,调用之前先设置[AutoID]字段为自增、整型,你给的有问题
exec proc_tp 'AA','工程部'
--查询结果
/*
AutoID UserID_A UserID_B WorkID Result
1 AA BB AA 评价结果
2 AA CC AA 评价结果
3 BB CC AA 评价结果
4 AA DD AA 评价结果
5 BB DD AA 评价结果
6 CC DD AA 评价结果
*/
CREATE TABLE [dbo].Sys_User( --员工表
[ID] int identity(1,1),
[UserID] [varchar](50) NOT NULL, --员工ID
[UserName] [varchar](50) NULL, --员工姓名
[UserOrg] [varchar](50) NULL) --部门
CREATE TABLE [dbo].[UserAssess]( --评价表
[AutoID] [varchar](50) NOT NULL, --自增长ID
[UserID_A] [varchar](50) NOT NULL, --评价对象A
[UserID_B] [varchar](50) NOT NULL, --评价对象B (A,B不能相同)
[WorkID] [varchar](50) NOT NULL, --投票人
[Result] [varchar](50) NULL) --评价结果
goset nocount on
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('AA','甲','工程部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('BB','乙','工程部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('CC','丙','工程部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('DD','丁','工程部')INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('EE','王','技术部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('FF','李','技术部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('HH','张','技术部')
INSERT INTO Sys_User(UserID,UserName,UserOrg) VALUES('II','刘','技术部')
set nocount off
go;with cte as
(
select a.id,a.UserOrg,a.username Am,b.username Bm,rid = row_number() over (order by getdate())
from sys_user a join sys_user b on a.userorg = b.userorg and a.userid <> b.userid
)select e.username + ':' + t.am + ' To ' + t.bm
from Sys_User e
join (select * from cte t
where not exists (select 1 from cte where am = t.bm and bm = t.am and rid > t.rid)
) t on t.UserOrg = e.UserOrg
order by e.iddrop table Sys_User,[UserAssess]
/***************************甲:甲 To 乙
甲:甲 To 丙
甲:乙 To 丙
甲:甲 To 丁
甲:丙 To 丁
甲:乙 To 丁
乙:乙 To 丁
乙:丙 To 丁
乙:甲 To 丁
乙:乙 To 丙
乙:甲 To 丙
乙:甲 To 乙
丙:甲 To 乙
丙:甲 To 丙
丙:乙 To 丙
丙:甲 To 丁
丙:丙 To 丁
丙:乙 To 丁
丁:乙 To 丁
丁:丙 To 丁
丁:甲 To 丁
丁:乙 To 丙
丁:甲 To 丙
丁:甲 To 乙
王:王 To 李
王:王 To 张
王:李 To 张
王:王 To 刘
王:李 To 刘
王:张 To 刘
李:张 To 刘
李:李 To 刘
李:王 To 刘
李:李 To 张
李:王 To 张
李:王 To 李
张:王 To 李
张:王 To 张
张:李 To 张
张:王 To 刘
张:李 To 刘
张:张 To 刘
刘:张 To 刘
刘:李 To 刘
刘:王 To 刘
刘:李 To 张
刘:王 To 张
刘:王 To 李(48 行受影响)
userid varchar(20) not null,
username varchar(20) ,
userorg varchar(20),
)
insert into txt values('AA','甲','11')
insert into txt values('BB','乙','11')
insert into txt values('CC','丙','11')
insert into txt values('DD','丁','11')
insert into txt values('EE','赵','22')
insert into txt values('FF','钱','22')
insert into txt values('GG','孙','22')
insert into txt values('HH','李','22')select * from txtselect a.username,b.username from txt a join txt b
on a.userorg=b.userorg and a.username<>b.username and a.userid>b.userid
select x.username,'->',a.username,b.username from txt x join txt a on x.userorg=a.userorg join txt b
on a.userorg=b.userorg and a.username<>b.username and a.userid>b.userid and x.userid>=b.userid
userid varchar(20) not null,
username varchar(20) ,
userorg varchar(20),
)
insert into txt values('AA','甲','11')
insert into txt values('BB','乙','11')
insert into txt values('CC','丙','11')
insert into txt values('DD','丁','11')
insert into txt values('EE','赵','22')
insert into txt values('FF','钱','22')
insert into txt values('GG','孙','22')
insert into txt values('HH','李','22')select * from txtselect a.username,b.username from txt a join txt b
on a.userorg=b.userorg and a.username<>b.username and a.userid>b.userid
select x.username,'->',a.username,b.username from txt x join txt a on x.userorg=a.userorg join txt b
on a.userorg=b.userorg and a.username<>b.username上面的是错的,48条记录应该对了
[UserID] [varchar](50) NOT NULL, --员工ID
[UserName] [varchar](50) NULL, --员工姓名
[UserOrg] [varchar](50) NULL) --部门
CREATE TABLE [dbo].[UserAssess]( --评价表
[AutoID] [varchar](50) NOT NULL, --自增长ID
[UserID_A] [varchar](50) NOT NULL, --评价对象A
[UserID_B] [varchar](50) NOT NULL, --评价对象B (A,B不能相同)
[WorkID] [varchar](50) NOT NULL, --投票人
[Result] [varchar](50) NULL) --评价结果
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('AA','甲','工程部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('BB','乙','工程部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('CC','丙','工程部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('DD','丁','工程部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('EE','王','技术部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('FF','李','技术部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('HH','张','技术部')
INSERT INTO [User](UserID,UserName,UserOrg) VALUES('II','刘','技术部')
GOCreate Proc P_Proc
AS
Begin
SET NOCOUNT ON; Create Table #Demo(P1 Varchar(50),P2 Varchar(50) )
DECLARE @USERID VARCHAR(50)
Declare CUS CURSOR FOR SELECT UserID FROM [User] ORDER BY UserID
OPEN CUS
FETCH NEXT FROM CUS INTO @USERID
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #Demo
SELECT @USERID,UserID
FROM [User] T1
WHERE UserID <> @USERID AND
NOT EXISTS(SELECT TOP 1 1 FROM #Demo WHERE (P1=T1.UserID And P2=@USERID) OR (P2=T1.UserID And P1=@USERID) )
ORDER BY T1.UserID
FETCH NEXT FROM CUS INTO @USERID
END
CLOSE CUS
DEALLOCATE CUS
Insert Into UserAssess
SELECT '自增长ID', T2.P1,T2.P2,T1.UserID,'结果' FROM [User] T1
Inner Join #Demo T2 On 1=1
Order by T1.UserID,T2.P1
Select * From UserAssess
DROP TABLE #DEMO
SET NOCOUNT OFF;
Endgo
exec P_Proc
GO
Drop Proc P_Proc
Drop Table [User]
Drop Table UserAssess