对不起,请原谅我无知地提出了直截了当的标题。
此代码/场景仅用于了解Im的来源(我不会发布真实代码),im不要求评估此代码或进行调试,可能存在索引错误等。这是在此处未经测试编写的。
这些桌子也是在这里制造的,因此,如果它们看起来很傻并且没有意义,那么您是对的。 但是请尽量记住问题所在,因为这是普遍存在的,可以应用于现实世界中的任何数据库模式。
问题
我需要计算员工出售给特定客户的次数,以及退还该客户最后出售的商品。粗体字是有问题的。我不知道如何创建此查询位而不损坏计数部分(卖方出售给多少客户),我尝试使用Order By,但没有返回我需要的东西。
SELECT StaffName, Count(SoldToCustomerId)
AS TimesSoldToCustomer, CustomerName, Item FROM CustomerHistory
INNER JOIN Seller ON SoldToCustomerId = CustomerId
GROUP BY SoldToCustomerId;
数据库
CustomerHistory
CustomerId CustomerName PurchasedDate Item
1 John 01/02/2018 Iphone
2 Tom 02/02/2018 Galaxy
3 Peter 03/02/2018 Ps4
1 John 05/02/2018 Xbox One
1 John 06/02/2018 Ps4
1 John 03/02/2018 PC
1 John 07/01/2017 graphic card
Seller
StaffId StaffName SoldToCustomerId
1 James 1
2 Tim 2
..
Ideal result from sql query
StaffName TimesSoldToCustomer CustomerName lastSoldItem
James 5 John Ps4 -- Last Item Sold
Tim 1 Tom Galaxy -- Last Item Sold
答案 0 :(得分:1)
使用如下所示的联接和子查询
select a.CustomerName,a.TimesSoldToCustomer ,
s.StaffName ,c.Item
from (
SELECT CustomerName, Count(SoldToCustomerId) as TimesSoldToCustomer
,min(CustomerId) as CustomerId
FROM CustomerHistory group by CustomerName
) a join Seller s on a.CustomerId =s.SoldToCustomerId
join ( select CustomerName,PurchasedDate,Item
from CustomerHistory t1 where PurchasedDate=( select max(PurchasedDate)
from CustomerHistory t2 where
t1.CustomerName=t2.CustomerName)
) c on a.CustomerName=c.CustomerName
答案 1 :(得分:1)
此外,请始终对列引用进行限定,以明确它们来自哪个表。
我的方法是分两个步骤完成。
它确实假定在任何给定日期没有客户购买一件以上的商品。
并且,按照要求,我试图忽略数据结构异常糟糕;)
(例如,如果某人从一个以上的卖家那里购买商品,则此数据模型将中断。因为您无法确定哪个销售记录对应于哪个卖家。)
SELECT
s.*,
h.customerName,
h.item
FROM
(
SELECT
s.StaffName,
s.CustomerID,
COUNT(*) AS TimesSoldToCustomer,
MAX(h.PurchasedDate) AS LastPurchasedDate
FROM
Seller AS s
INNER JOIN
CustomerHistory AS h
ON s.SoldToCustomerId = h.CustomerId
GROUP BY
s.StaffName,
s.CustomerID
)
AS s
INNER JOIN
CustomerHistory AS h
ON s.SoldToCustomerId = h.CustomerId
AND s.LastPurchasedDate = h.PurchaseDate
答案 2 :(得分:1)
对于所需的结果,有很多方法可以实现,但是,所有方法都使用子查询。看到一个建议
public T getSmallest() throws EmptyListException
{
if(isEmpty())
throw new EmptyListException("List is empty");
DLNode<T> current = front;
DLNode<T> minNode = current;
int minimum = current.getValue();
while(current.getNext() != null)
{
if(minimum > current.getValue())
{
minNode = current;
minimum = current.getValue();
}
current = current.getNext();
}
return current.getData();
}
答案 3 :(得分:0)
我建议使用子查询返回最后出售的商品。用实际数据写起来应该会更容易,但是我基本上会按照购买顺序按购买顺序进行订购。