Вернуть несколько выбранных значений внутри одного запроса? - PullRequest
0 голосов
/ 19 марта 2019

Извините за заголовок, извините за невежество в разработке прямого к точечному названию.

Этот код / ​​сценарий просто для понимания того, откуда я берусь (я не буду публиковать реальный код), я не прошу ни оценивать этот код, ни отлаживать, могут быть ошибки индекса и т. Д. Это было написано здесь без тестирования.

Здесь также изготовлены таблицы, так что если они выглядят глупо и не имеют смысла, вы правы. Но, пожалуйста, постарайтесь помнить, в чем заключается проблема, поскольку она универсальна и может быть применена к любой схеме базы данных в реальном мире.

Задача

Мне нужно посчитать, сколько раз персонал продал конкретному клиенту, а также вернуть последний проданный товар от этого клиента . Смелые слова - проблемный бит. Я не знаю, как создать этот бит запроса, не повредив счетную часть (Сколько клиентов продал продавец), я пытался использовать 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 ]

1 голос
/ 19 марта 2019

Для достижения желаемого результата есть много способов сделать это, однако все они используют подзапросы. Смотрите одно предложение

SELECT 
        StaffName,
        b.qtd AS TimesSoldToCustomer,
        a.CustomerName,
        b.Item AS lastSoldItem
    FROM CustomerHistory AS a
    INNER JOIN Seller ON SoldToCustomerId = CustomerId
    LEFT JOIN (SELECT
                    Count(DISTINCT a.CustomerId) AS qtd,
                    a.CustomerName,
                    (SELECT
                        c.Item
                    FROM CustomerHistory AS c
                    WHERE c.CustomerName = a.CustomerName AND c.PurchasedDate = MAX(a.PurchasedDate)) AS Item
                    FROM CustomerHistory AS a
                    GROUP BY
                    a.CustomerName) AS b ON b.CustomerName = a.CustomerName
    GROUP BY SoldToCustomerId;
1 голос
/ 19 марта 2019

используйте объединение и подзапрос, как показано ниже

 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 голос
/ 19 марта 2019

Кроме того, всегда уточняйте ссылки на столбцы, чтобы было ясно, из какой они таблицы.

Мой подход состоит в том, чтобы сделать это в два этапа.

  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
0 голосов
/ 19 марта 2019

Я бы предложил использовать подзапрос, чтобы вернуть последний проданный товар.Должно быть проще писать с фактическими данными, но я бы в основном заказывал по дате покупки в порядке убывания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...