0

我需要查询前 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

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

4

3 回答 3

1

像这样的东西适用于 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
于 2012-12-03T08:23:57.883 回答
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 中定义。

这是否接近你正在寻找的东西?

于 2012-12-03T08:13:51.800 回答
0

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

join CustomerAddress on CustomerID = Add_CustID

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

join CustomerAddress on CustomerID = Add_CustID where <conditions>

于 2012-12-03T08:11:43.413 回答