【问题标题】:SQL query need to get user where program column includes certain programSQL查询需要获取程序列包含某个程序的用户
【发布时间】:2009-09-23 21:44:13
【问题描述】:

让我尽我所能解释一下:

我有一个表,其中有一个用户 ID 列和一个程序列(以及其他不重要的列)。我需要在该表中找到该表中具有多个实例的用户,其中该用户具有与之关联的 X 程序。

谁能帮帮我?

到目前为止我所拥有的是:

SELECT 
            WPP.USERID 
        FROM 
            WEBPROGRAMPARTICIPANTS WPP 
        INNER JOIN 
            WEBPROGRAMS WP 
        ON 
            WPP.PROGRAMCODE = WP.PROGRAMCODE 
        WHERE 
            CONFIRMED = 1 AND 
            WP.PROGRAMTYPE IN ('1') AND 
            WP.PROGRAMSTARTDATE >= '2000-01-01' AND 
            WPP.PROGRAMCODE = 'CL2010'
        GROUP BY 
            WPP.USERID 
        HAVING 
            COUNT(WPP.PROGRAMCODE) > 1 

【问题讨论】:

    标签: sql select count


    【解决方案1】:
    DECLARE @Program VARCHAR(MAX)
    
    SET @Program = 'X'
    
    SELECT UserID, COUNT(Program) Duplicates
    FROM Table
    WHERE Program = @Program
    AND COUNT(Program) > 1
    GROUP BY UserID
    

    【讨论】:

      【解决方案2】:

      我认为你所缺少的都是 wpp.programcode 的分组很好

      SELECT 
                              WPP.USERID 
                      FROM 
                              WEBPROGRAMPARTICIPANTS WPP 
                      INNER JOIN 
                              WEBPROGRAMS WP 
                      ON 
                              WPP.PROGRAMCODE = WP.PROGRAMCODE 
                      WHERE 
                              CONFIRMED = 1 AND 
                              WP.PROGRAMTYPE IN ('1') AND 
                              WP.PROGRAMSTARTDATE >= '2000-01-01' AND 
                              WPP.PROGRAMCODE = 'CL2010'
                      GROUP BY 
                              WPP.USERID , WPP.PROGRAMCODE
                      HAVING 
                              COUNT(WPP.PROGRAMCODE) > 1
      

      如果您不想将其限制为程序代码 cl2010,请将其从 where 子句中删除。我还会将 wpp.programcode 添加到您的选择列表中,这样您就可以看到哪些代码被重复了,如果您想查看多少次,则可以计算(wpp.programcode)。

      【讨论】:

      • 我需要 CL2010 的程序代码,因为我试图找到那些参加过包括该程序在内的多个程序的用户
      • 没关系,但它也会限制您使用该程序
      【解决方案3】:

      我假设它没有找到任何重复项,即使您知道它们存在。对于您的查询,如果您的副本在 2000 年 1 月 1 日之前具有不同的类型、代码或开始日期,那么这些记录将在您运行计数之前被过滤掉。请记住,它会在流程的早期应用“位置”。

      记住这个处理顺序:http://tinman.cs.gsu.edu/~raj/sql/node22.html

      【讨论】:

        【解决方案4】:

        您可能必须将其作为子查询执行,因为一旦添加了将结果限制为特定程序类型的 where 子句,您将只能找到具有该程序类型的多行的参与者。您可能正在寻找这样的东西:

        SELECT 
            WPP.USERID 
        FROM 
            WEBPROGRAMPARTICIPANTS WPP 
        INNER JOIN 
            WEBPROGRAMS WP ON WPP.PROGRAMCODE = WP.PROGRAMCODE 
        WHERE 
            CONFIRMED = 1 AND 
            WP.PROGRAMTYPE IN ('1') AND 
            WP.PROGRAMSTARTDATE >= '2000-01-01' AND 
            WPP.PROGRAMCODE = 'CL2010'
            WPP.USERID IN (
                SELECT 
                    WPP.USERID
                FROM
                    WEBPROGRAMPARTICIPANTS WPP
                GROUP BY 
                    WPP.USERID 
                HAVING 
                    COUNT(WPP.PROGRAMCODE) > 1)
        GROUP BY
            WPP.USERID
        

        【讨论】:

        • 我尝试了这个建议,但是返回的结果超出预期
        • 您的回报超出预期是什么意思?返回了多个 USERID 或与您的条件不匹配的 USERID?我认为您可能遇到了第一个错误,我明白我为什么要更新以修复它。
        猜你喜欢
        • 1970-01-01
        • 2022-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多