【问题标题】:using group by operators in sql在 sql 中使用 group by 运算符
【发布时间】:2015-10-12 22:14:24
【问题描述】:

我有两列 - 电子邮件 ID 和客户 ID,其中一个电子邮件 ID 可以与多个客户 ID 相关联。现在,我只需要列出计数超过 1 个客户 ID 的电子邮件 ID(连同其相应的客户 ID)。我尝试使用分组集、汇总和多维数据集运算符,但是没有得到想要的结果。

任何帮助或指点将不胜感激。

【问题讨论】:

  • 这是什么具体的 RDBMS?请添加相关标签 - 例如oraclemysqlpostgresqldb2sql-serverinterbase 或其他您可能使用的标签

标签: sql sql-server group-by cube rollup


【解决方案1】:
SELECT emailid
FROM 
(  SELECT emailid, count(custid)
   FROM table
   Group by emailid
   Having count(custid) > 1
)

【讨论】:

    【解决方案2】:

    认为如果我正确理解你的问题,这会给你想要的东西

    select emailid, customerid from tablename where emailid in 
    (
    select emailid from tablename group by emailid having count(emailid) > 1
    )
    

    【讨论】:

    • 这是为我做的...没有意识到它会这么简单...使用 group by 运算符使事情变得不必要地复杂化
    【解决方案3】:

    听起来你需要使用 HAVING

    例如

    SELECT email_id, COUNT(customer_id)
    From sometable
    GROUP BY email_id
    HAVING COUNT(customer_id) > 1
    

    HAVING 允许您按照特定列的分组进行过滤。

    【讨论】:

      【解决方案4】:
      WITH email_ids AS (
          SELECT email_id, COUNT(customer_id) customer_count
          FROM Table
          GROUP BY email_id
          HAVING count(customer_id) > 1
      )
      
      SELECT t.email_id, t.customer_id
      FROM Table t
      INNER JOIN email_ids ei
          ON ei.email_id = t.email_id
      

      【讨论】:

        【解决方案5】:

        如果您需要以逗号分隔的所有客户 ID 列表以及单个电子邮件 ID,您可以使用 GROUP_CONCAT

        这将找到至少有 1 个 customer_id 的所有 email_id,并为您提供该 email_id 的所有 customer_id 的逗号分隔列表:

        SELECT email_id, GROUP_CONCAT(customer_id)
        FROM your_table
        GROUP BY email_id
        HAVING count(customer_id) > 1;
        

        假设 email_id #1 分配给 customer_ids 1、2 和 3,您的输出将如下所示:

        email_id | customer_id
        1        | 1,2,3
        

        我没有意识到你在使用 MS SQL,这里有一个关于在 MS SQL 中模拟 GROUP_CONCAT 的线程:Simulating group_concat MySQL function in Microsoft SQL Server 2005?

        【讨论】:

        • 在这种情况下,我不会得到客户 ID...它只会列出电子邮件及其数量
        • 查看我发布的 GROUP_CONCAT。
        • ms sql server 有类似的吗?
        • 哦,我不知道你用的是MS SQL,让我看看
        • 是的,我也看到了...这比我希望的要复杂得多...无论如何,凯文的解决方案对我有用...感谢您的帮助
        【解决方案6】:
        SELECT t1.email, t1.customer
        FROM table t1 
        INNER JOIN (
            SELECT email, COUNT(customer)
            FROM table
            GROUP BY email
            HAVING COUNT(customer)>1
            ) t2 on t1.email = t2.email
        

        这应该可以满足您的需求。 基本上,正如其他人所说,您可以使用 HAVING 按结果过滤分组。但是,由于您之后想要 customerids,请将整个选择加入到您的原始表中以获取结果。可能做得更漂亮,但这很容易理解。

        【讨论】:

          【解决方案7】:
          SELECT 
              email_id,
              STUFF((SELECT ',' + CONVERT(VARCHAR,customer_id) FROM cust_email_table T1 WHERE T1.email_id = T2.email_id
                    FOR
                     XML PATH('')
                    ),1,1,'') AS customer_ids
          FROM
              cust_email_table T2
          GROUP BY email_id
          HAVING COUNT(*) > 1
          

          这将为您提供每个电子邮件 ID 和逗号分隔的客户 ID 列表的单行。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-12-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多