【问题标题】:Return only 1 address for each customer每位客户仅返回 1 个地址
【发布时间】:2012-12-03 16:23:57
【问题描述】:

我需要查询前 500 名客户(最佳买家)的地址。许多公司有多个地址。

有数据的表格:

  • 客户信息
  • 客户地址
  • 交易信息
  • 事务元素

我的查询是这样的:

select Customername, CustomerStreet --etc 
from CustomerInfo 
join CustomerAddress on CustomerID = Add_CustID
join  TransactionInfo on Trn_CustID = CustomerID
JOIN TransactionElements ON Trn_CustID = TrE_CustID


GROUP BY CustomerName, CustomerStreet --etc
ORDER BY SUM (TrE_TranValue) DESC

它返回一个公司的多个地址,我只需要一个。

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    如果您使用的是 SQL Server 2005 及更高版本(您在这方面不够具体),则一种方法是使用 CTE(通用表表达式)。

    使用此 CTE,您可以按某些标准(即您的 CustomerId)对数据进行分区,并让 SQL Server 为每个“分区”从 1 开始为您的所有行编号,并按某些标准排序。

    所以试试这样的:

    ;WITH CustomerAndAddress AS
    (
       SELECT 
           c.Customername, ca.CustomerStreet ,
           ROW_NUMBER() OVER(PARTITION BY c.CustomerId ORDER BY ca.AddressID DESC) AS 'RowNum'
       FROM 
           dbo.CustomerInfo c
       INNER JOIN 
           dbo.CustomerAddress ca ON c.CustomerID = ca.Add_CustID       
       WHERE
          ......
    )
    SELECT 
       Customername, CustomerStreet 
    FROM 
       CustomerAndAddress
    WHERE
       RowNum = 1
    

    在这里,我只为每个“分区”(即每个CustomerId)选择“第一个”条目-按某些标准排序(我只是从地址中任意选择AddressID-根据需要进行调整)在你的 CTE 中定义。

    这是否符合您的要求??

    【讨论】:

    • 我已经检查了数据库,我需要选择当前地址。我不知道哪一列标识了这一列。很可能它是 int 值(它必须是其他地址中最高的)。我只需要选择该列值最高的那个。
    • @user1646678:那么,一旦您知道哪一列标识了最近的地址 - 只需将该列放入 ORDER BYOVER (....) 子句中,您就完成了
    【解决方案2】:

    这样的东西可以在 sqlserver 2005+ 上运行。我还建议为您的表添加一些别名并参考这些别名。

    select CI.Customername, CA.CustomerStreet --etc 
    from CustomerInfo CI
    cross apply 
    (select top 1 Customername, CustomerStreet --etc
    from CustomerAddress where CustomerID = CI.Add_CustID) CA
    join  TransactionInfo TI on TI.Trn_CustID = CI.CustomerID
    JOIN TransactionElements ON CI.CustomerID = TE.TrE_CustID
    GROUP BY CustomerName, CustomerStreet --etc
    ORDER BY SUM (TrE_TranValue) DESC
    

    【讨论】:

      【解决方案3】:

      如果CustomerInfo 有很多CustomerAddress,则此查询将为每个CustomerAddress(笛卡尔积)返回CustomerInfo

      join CustomerAddress on CustomerID = Add_CustID

      因此,如果您只需要获取一个地址,则必须添加选择单个CustomerAddress 所需的条件:

      join CustomerAddress on CustomerID = Add_CustID where <conditions>

      【讨论】:

        猜你喜欢
        • 2017-12-27
        • 2010-12-16
        • 2015-08-08
        • 2012-07-10
        • 2017-12-14
        • 1970-01-01
        • 2020-08-12
        • 2015-12-21
        • 1970-01-01
        相关资源
        最近更新 更多