【问题标题】:How to sort by domain name using SQL Server 2014?如何使用 SQL Server 2014 按域名排序?
【发布时间】:2018-01-15 20:34:32
【问题描述】:

我有两张桌子:

  1. Contact(列是:ContactId、FirstName、LastName、EmailAddress)
  2. Address(列是:ContactId、AddressLine1、City、CountryCode)

一些EmailAddresses 有多个ContactId、FirstName、LastName 和AddressLine1

我正在尝试获取 DISTINCT 电子邮件地址的列表以及与该电子邮件地址相关的任何名称/详细信息。

我还在尝试按域名对所有电子邮件地址进行排序(例如,所有 gmail.com 一起,所有 Hotmail.com 一起等等)

到目前为止我的代码:

SELECT DISTINCT(EmailAddress),
    FirstName,
    LastName,
    AD.AddressLine1, AD.City, AD.CountryCode
FROM 
    [Contact] C
INNER JOIN 
    Address AD ON C.ContactId = AD.ContactId
WHERE 
    (set of conditions)
-------Code works fine until here but sorting by domain name doesn't work---
ORDER BY 
    SUBSTRING(EMailAddress,(CHARINDEX('@', EMailAddress) + 1), 1)

我得到的错误信息是:

如果指定了 SELECT DISTINCT,则 ORDER BY 项目必须出现在选择列表中。

【问题讨论】:

  • 嗯,它 看起来 就像您试图仅将 DISTINCT 应用于电子邮件地址,但这不是它的工作原理(它适用于 所有列)。你真的有可能在这里精确复制吗?两个不同的联系人 ID 真的可以有相同的电子邮件地址吗?和同一个地址?您是否尝试过简单地删除DISTINCT,这样您就可以按不在选择列表中的内容进行排序?

标签: sql sql-server distinct


【解决方案1】:

如果您希望每封电子邮件有一行,请使用row_number()

SELECT *
FROM (SELECT EmailAddress, FirstName, LastName,
             AD.AddressLine1, AD.City, AD.CountryCode,
             ROW_NUMBER() OVER (PARTITION BY EmailAddress ORDER BY EmailAddress) as seqnum
      FROM [Contact] C INNER JOIN
            Address AD
           ON C.ContactId = AD.ContactId
      WHERE (set of conditions)
    -------Code works fine until here but Sorting by domain name doesn't 
     ) x
WHERE seqnum = 1
ORDER BY SUBSTRING(EMailAddress,(CHARINDEX('@', EMailAddress) + 1), 1)

【讨论】:

    【解决方案2】:

    试试这个,使用派生表

     select distinct * 
     from (
     SELECT EmailAddress
          ,SUBSTRING(EMailAddress,(CHARINDEX('@',EMailAddress)+1),1) [Domain]
          ,FirstName
          ,LastName
          ,AD.AddressLine1
          ,AD.City
          ,AD.CountryCode
    
    FROM [Contact] C
    INNER JOIN Address AD ON C.ContactId = AD.ContactId
     ) x
     order by domain
    

    【讨论】:

    • 这很好,但我不确定为什么我会收到重复的姓名和电子邮件地址。只有 AddressLine1 和 City 不同。
    • @user1777929 如果您得到重复,这听起来像是数据问题,而不是查询语法问题。
    • @user1777929 按联系人 ID 发布您的联系人数据订单。
    • 以及您的地址表顺序(按联系人 ID)
    【解决方案3】:

    这应该可行:

    SELECT  distinct 
            c.EmailAddress
            , c.SUBSTRING(EMailAddress,(CHARINDEX('@',EMailAddress)+1),1) AS [Domain]
            , c.FirstName
            , c.LastName
            , ad.AddressLine1
            , ad.City
            , ad.CountryCode
    FROM    Contacts c
    JOIN    Address ad
            on c.ContactId = ad.ContactId
    GROUP   
    BY      c.EmailAddress
            , c.SUBSTRING(EMailAddress,(CHARINDEX('@',EMailAddress)+1),1)
            , c.FirstName
            , c.LastName
            , ad.AddressLine1
            , ad.City
            , ad.CountryCode
    ORDER 
    BY      c.SUBSTRING(EMailAddress,(CHARINDEX('@',EMailAddress)+1),1) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多