在一个查询中返回多个选择的值?

时间:2019-03-19 16:43:24

标签: mysql sql

对不起,请原谅我无知地提出了直截了当的标题。

此代码/场景仅用于了解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

4 个答案:

答案 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)

此外,请始终对列引用进行限定,以明确它们来自哪个表。

我的方法是分两个步骤完成。

  1. 了解卖方向客户出售了多少次,以及最后一次销售的日期
  2. 再次加入历史记录数据,以了解在最新日期售出的商品

它确实假定在任何给定日期没有客户购买一件以上的商品。

并且,按照要求,我试图忽略数据结构异常糟糕;)

(例如,如果某人从一个以上的卖家那里购买商品,则此数据模型将中断。因为您无法确定哪个销售记录对应于哪个卖家。)

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)

我建议使用子查询返回最后出售的商品。用实际数据写起来应该会更容易,但是我基本上会按照购买顺序按购买顺序进行订购。