1

私のDBには、購入を行う顧客がいて、それらの購入は、その購入を支援した従業員に関連付けられています。以下にクエリを作成しました。これにより、顧客の合計購入数、最初の購入、最後の購入のリストが提供されます。最後の購入に関連付けられた従業員名も必要ですか?

Customer
-cstId
-cstName

Purchase
-cstId
-soldDate
-empId

Employee
-FirstName
-LastName
-empId


SELECT customer.cstName, MAX(purchase.soldDate) AS [Last Purchase], MIN(purchase.soldDate) AS [First Purhcase], COUNT(invTruck.invId)
               AS [Total Purchases]
FROM  customer INNER JOIN
               purchase ON customer.cstId = purchase.cstId 
               INNER JOIN
               employee ON purchase.empId = employee.empId
GROUP BY customer.cstName
4

4 に答える 4

1

ストアドプロシージャを使用できますか? 私は通常、このような状況ではメモリ テーブルに戻ります。

Declare @tblCust TABLE (
    cstid int null,
    cstName varchar(50) null, 
    lastpurchase datetime null,
    firstpurchase datetime null, 
    empid varchar(50) null
    )
Insert into @tblCust(cstid, cstname, lastpurchase, firstpurchase)        
SELECT purchase.cstid, customer.cstName, MAX(purchase.soldDate) AS [Last Purchase], 
    MIN(purchase.soldDate) AS [First Purhcase]
FROM  customer INNER JOIN
    purchase ON customer.cstId = purchase.cstId 
GROUP BY purchase.cstId, customer.cstName

Update t set EmpId = p.EmpId
From @tblCust t
        INNER JOIN Purchase p ON t.cstId = p.cstid and t.LastPurchase = p.soldDate

これで、一時テーブルに従業員 ID があり、データを返すか、必要な他のテーブルに結合できます。

于 2012-11-13T19:14:16.727 に答える
0

単純なSCALARSUBQUERYで拡張できます

SELECT
    customer.cstName,
    MAX(purchase.soldDate) AS [Last Purchase],
    MIN(purchase.soldDate) AS [First Purhcase],
    COUNT(invTruck.invId) AS [Total Purchases],
    (SELECT TOP(1) e.lastname
     FROM purchase p
     INNER JOIN employee e ON p.empId = e.empId
     WHERE customer.cstId = p.cstId
     ORDER BY p.soldDate DESC) lastPurchaseEmployee
FROM  customer
INNER JOIN purchase
    ON customer.cstId = purchase.cstId 
INNER JOIN employee
    ON purchase.empId = employee.empId
GROUP BY
    customer.cstId, customer.cstName
于 2012-11-13T21:13:45.530 に答える
0

APPLY を使用できます: http://msdn.microsoft.com/library/ms175156(v=sql.105).aspx

相互適用を使用して、購入リストとそれぞれの従業員を取得し、TOP 1 で、soldDate desc で並べ替えます

例:

CROSS APPLY (
select top 1 p.empId
from purchase p
where p.cstId = customer.cstId
order by soldDate desc
) o (emp)

選択に o.emp を追加します

構文が 100% 完璧かどうかは 100% 確信が持てませんが、アイデアはそこにあります :P

于 2012-11-13T19:14:13.703 に答える
0

購入テーブルに主キーがあると仮定しています。私はそれを「purchaseID」と名付けました:

SELECT customer.cstName, 
    MAX(purchase.soldDate) AS [Last Purchase], 
    MIN(purchase.soldDate) AS [First Purhcase], 
    COUNT(invTruck.invId)  AS [Total Purchases], 
    LastPurchase.empID     AS [Last Purchase Employee]
FROM  customer INNER JOIN
           purchase ON customer.cstId = purchase.cstId 
           INNER JOIN
           employee ON purchase.empId = employee.empId
           CROSS APPLY (
               SELECT TOP 1 * 
               FROM purchase px 
               WHERE px.purchaseID = purchase.purchaseID 
               ORDER BY px.soldDate DESC) AS LastPurchase
GROUP BY customer.cstName,
    LastPurchase.empID

CROSS APPLY が行うことは、内部の WHERE 基準も利用して、すべてのレコードで囲まれた select ステートメントを実行することです。これは、LEFT JOIN と同様に動作する OUTER APPLY に対して、INNER JOIN と同様に動作します。

于 2012-11-13T19:23:20.020 に答える