Требуется помощь T-Sql в Sql Server 2005 - PullRequest
0 голосов
/ 07 марта 2011

Я создал одну хранимую процедуру, которая выполняется на 5000 пользователей в таблице tbluser с некоторыми условиями фильтрации в базе данных. Есть 4 условия фильтрации (FC1, FC2, FC3, FC4). Условие фильтрации имеет некоторые ListBox и раскрывающийся список отдела и Страны. Я хочу вывод, как указано ниже:

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

Я получил ID, имя, штатный номер, отдел в наборе результатов, но не баллы.

расчет очков будет основан на условиях фильтрации, таких как

если совпадающий пользователь 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)

все условия фильтрации реализованы с помощью логики ИЛИ.

Ответы [ 3 ]

1 голос
/ 07 марта 2011

Вы пытались реализовать оператор 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 голосов
/ 07 марта 2011

Вы можете использовать левое внешнее объединение с условиями фильтра, группировать по идентификатору пользователя, чтобы не получать дубликаты, добавить значение 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
0 голосов
/ 07 марта 2011

Я думаю, что вам лучше отработать точки в вашем коде, чем в SQL

Единственный способ, которым я могу думать, это сделать с СОЮЗАМИ, что было бы ужасно

...