2012-11-13 25 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 
扩展它