2012-11-13 107 views
1

在我的數據庫中,我有客戶,他們進行購買,然後這些購買與與該購買協助的員工關聯。我在下面寫了一個查詢,這將向我提供一份客戶名單,其中列出了他們已完成的總購買次數,首次購買次數和最後一次購買次數。我還希望與上次購買相關的員工姓名?SQL Group,獲取第一次購買,最後一次購買和與上次購買相關聯的最後一名員工

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 

回答

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。

0

你可以使用適用於:排序soldDate遞減http://msdn.microsoft.com/library/ms175156(v=sql.105).aspx

使用交叉適用於獲得購買和各員工的名單,TOP 1和

例如:

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

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應用確實是運行在每個記錄封閉的select語句,還利用內部的WHERE條件。它的行爲類似於INNER JOIN相對於OUTER APPLY,其行爲類似於LEFT JOIN。

0

你可以只用一個簡單的標量子查詢

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 
擴展它