2011-03-07 67 views
0

我创建了一个存储过程,它在tbluser表中有5000个用户在数据库中有一些过滤条件运行。有4个过滤条件(FC1,FC2,FC3,FC4)。过滤条件有部门的一些列表框和下拉列表和countries.I希望输出,如下所示:在Sql Server 2005中需要T-Sql帮助

ID Name StaffNo department Points 
1 KK  111  dep1  2 
2 NN  222  dep2  1 
3 DD  333  dep3  4 

我ID,姓名,StaffNo,部门的ResultSet而不是点。

点计算将基于像

过滤条件,如果与之匹配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 '[email protected]+')' 
    ---------------------Update--------------------------------------- 
    ...other filtering condition 
    EXEC (@SQL) 

所有的过滤条件都是用OR逻辑来实现的。

回答

1

你试过实施CASE声明来计算“积分”?

--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) 
+0

感谢您提供解决方案。但在我的情况下,FC1,2,3,4与4个不同的表无关tbluser表 – Sukhjeevan 2011-03-07 12:20:14

+0

您是否可以根据外键,也许[UserID]加入表?你可能会发表一个表格的例子,这样我可以给你一个更好的解决方案吗? – FarligOpptreden 2011-03-07 12:22:08

+0

plz查看更新后的问题。 – Sukhjeevan 2011-03-07 12:48:06

0

我想你可能会更好的工作出在你的代码点,而不是在SQL

我能想到这样做的唯一方法是与工会这将是可怕的

0

您可以使用左外连接到您的过滤条件,按用户名不重复获得,为命中加1的值,并且使用聚结,因为没有命中设定为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