我创建了一个存储过程,在tbluser表中运行5000个用户,数据库中有一些过滤条件。有4个过滤条件(FC1,FC2,FC3,FC4)。过滤条件有一些ListBox和下拉列表的部门和country.I想要输出如下:
ID Name StaffNo department Points
1 KK 111 dep1 2
2 NN 222 dep2 1
3 DD 333 dep3 4
我得到了ID,姓名,StaffNo,结果集中的部门而不是积分。
点数计算将基于过滤条件,如
如果FC1匹配用户获得点1,如果FC1和FC2匹配用户获得2点,如果FC1,FC2和FC3匹配用户获得3点等。
--in stored procedure i m using dynamic query
DECLARE @SQL VARCHAR(2000)
SET @SQL = 'SELECT U.UserID, U.StaffNo,U.FirstName+'' ''+ U.LastName AS EmployeeName,''?'' AS Points FROM tblUser U '
SET @SQL = @SQL+' WHERE U.Department in (' + @SqlDepartment + ') '
---------------------Update---------------------------------------
IF @SqlLanguage <> ''
SET @SQL = @SQL+' OR U.UserID IN (SELECT UserID FROM Country WHERE LCValues IN ('+ @SqlLanguage +') )'
IF @SqlAreas <> ''
SET @SQL = @SQL+' OR U.UserID IN (SELECT UserID FROM tblAreas WHERE '+@SqlAreas+')'
---------------------Update---------------------------------------
...other filtering condition
EXEC (@SQL)
所有过滤条件都使用OR逻辑实现。
答案 0 :(得分:1)
您是否尝试过实施CASE语句来计算&#34; Points&#34;?
--in stored procedure i m using dynamic query
DECLARE @SQL VARCHAR(2000)
SET @SQL = '
SELECT
U.[UserID],
U.[StaffNo],
U.[FirstName]+'' ''+ U.[LastName] AS EmployeeName,
(
CASE WHEN EXISTS(SELECT 1 FROM [Country] WHERE /*Your filter comes in here*/) THEN 1 ELSE 0 END +
CASE WHEN EXISTS(SELECT 1 FROM [tblAreas] WHERE /*Your filter comes in here*/) THEN 1 ELSE 0 END +
CASE WHEN EXISTS(SELECT 1 FROM [OtherTable1] WHERE /*Your filter comes in here*/) THEN 1 ELSE 0 END +
CASE WHEN EXISTS(SELECT 1 FROM [OtherTable2] WHERE /*Your filter comes in here*/) THEN 1 ELSE 0 END
) AS Points
FROM [tblUser] U'
SET @SQL = @SQL+' WHERE U.Department in (' + @SqlDepartment + ') OR'...
...other filtering condition
EXEC (@SQL)
答案 1 :(得分:0)
我认为你可能会更好地解决代码中的点而不是SQL
我能想到的唯一方法是使用UNIONS,这将是非常可怕的
答案 2 :(得分:0)
您可以使用左外连接到您的过滤条件,按UserID分组不获取重复项,为匹配添加值1并使用coalesce设置0表示没有命中。
一些示例代码,显示我的意思是使用区域和国家作为过滤条件。
declare @U table (UserID int, Name varchar(50), StaffNo char(3), department char(4))
declare @C table (CountryID int, UserID int)
declare @A table (AreaID int, UserID int)
insert into @U values (1, 'KK', '111', 'dep1')
insert into @U values (2, 'NN', '222', 'dep2')
insert into @U values (3, 'DD', '333', 'dep3')
insert into @C values(1, 1)
insert into @C values(2, 1)
insert into @C values(3, 2)
insert into @C values(3, 3)
insert into @A values(1, 1)
insert into @A values(2, 1)
insert into @A values(3, 2)
select
U.UserID,
U.Name,
U.StaffNo,
U.department,
coalesce(C.Point, 0)+coalesce(A.Point,0) as Points
from @U as U
left outer join
(select UserID, 1 as Point
from @C
-- where ...?
group by UserID) as C
on U.UserID = C.UserID
left outer join
(select UserID, 1 as Point
from @A
-- where ...?
group by UserID) as A
on U.UserID = A.UserID