【问题标题】:T-Sql help needed in Sql Server 2005Sql Server 2005 中需要 T-Sql 帮助
【发布时间】:2011-07-10 06:59:20
【问题描述】:

我创建了一个存储过程,它在 tbluser 表中运行 5000 个用户,并在数据库中有一些过滤条件。有 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)

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

【问题讨论】:

    标签: asp.net sql-server-2005 stored-procedures dynamic-sql


    【解决方案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)
    

    【讨论】:

    • 感谢您提供解决方案。但在我的情况下,FC1、2、3、4 与 4 个不同的表有关,而不是 tbluser 表
    • 您是否能够基于外键(可能是 [UserID])连接表?您能否发布一个表格的示例,以便我可以为您提供更好的解决方案?
    • 我更新了我的答案,用一种快速的方法来实现你可能正在寻找的东西。这是我能想到的最好的方法,而无需看到一些更详细的表结构等等......
    • 谢谢老兄。太棒了。我得到了我所需要的解决方案。非常感谢。
    【解决方案2】:

    我认为你最好在代码中而不是在 SQL 中计算要点

    我能想到的唯一方法是使用 UNIONS,这太可怕了

    【讨论】:

      【解决方案3】:

      您可以对过滤条件使用左外连接,按 UserID 分组以避免重复,为命中添加值 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
      

      【讨论】:

        猜你喜欢
        • 2012-03-05
        • 2010-10-13
        • 1970-01-01
        • 2017-09-28
        • 2010-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-04
        相关资源
        最近更新 更多