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

1 つの会社の複数の住所が返されます。必要なのは 1 つだけです。

4

3 に答える 3

1

1つのアプローチは、SQL Server 2005以降を使用している場合はCTE(共通テーブル式)を使用することです(その点については十分に具体的ではありません)。

このCTEを使用すると、データをいくつかの基準(つまり、)でパーティション化し、CustomerIdSQL 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

ここでは、CTEで定義する必要のある各「パーティション」(つまり、各CustomerId)の「最初の」エントリのみを選択しています。AddressID

それはあなたが探しているものに近づいていますか?

于 2012-12-03T08:13:51.800 に答える
1

このようなものは、sqlserver2005以降で機能します。また、テーブルにいくつかのエイリアスを追加して、それらを参照することをお勧めします。

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 に答える
0

CustomerInfoが多数ある場合CustomerAddress、このクエリはCustomerInfoそれぞれCustomerAddress(デカルト積)に対して返されます:

join CustomerAddress on CustomerID = Add_CustID

したがって、アドレスを1つだけ取得する必要がある場合は、単一を選択するために必要な条件を追加する必要がありますCustomerAddress

join CustomerAddress on CustomerID = Add_CustID where <conditions>

于 2012-12-03T08:11:43.413 に答える