SQL Как связать нижнюю строку из другого выбора - PullRequest
0 голосов
/ 12 января 2019

Я с неделю ищу эту проблему. Я пробую много кода, и я не могу получить правильный ответ, вот проблема: У меня есть таблица продавца, с которой каждый раз покупатель связывается с этим продавцом, продал он что-то или нет.

Таблица продавца (я приведу данные только для одного продавца, чтобы дать вам более конкретную проблему)

  • SellerID - phonecalldate - Последовательность - Продажа (Bool)
  • 100 - 2018-01-05 - 1 - 0
  • 100 - 2018-01-05 - 2 - 0
  • 100 - 2018-01-05 - 3 - 1
  • 100 - 2018-01-05 - 4 - 0
  • 100 - 2018-01-05 - 5 - 0
  • 100 - 2018-01-10 - 1 - 0
  • 100 - 2018-01-10 - 2 - 0
  • 100 - 2018-01-10 - 3 - 0
  • 100 - 2018-01-10 - 4 - 1
  • 100 - 2018-01-10 - 5 - 0
  • 100 - 2018-01-10 - 6 - 0
  • 100 - 2018-01-10 - 7 - 0
  • 100 - 2018-01-10 - 8 - 0
  • 100 - 2018-01-10 - 9 - 0
  • 100 - 2018-01-10 - 10 - 0

Я хочу: сколько раз он не продавал между телефонными звонками. Я должен иметь в этой модели 3 ответа:

1- a sequence of 2 during  2018-01-05 sequence 1 to  2018-01-05 sequence 2
2- a sequence of 5 during  2018-01-05 sequence 4 to  2018-01-10 sequence 3 
2- a sequence of 6 during  2018-01-10 sequence 5 to  2018-01-10 sequence 10

Я сделал прямо сейчас: я пытаюсь найти границу и получить счетчик между этими двумя границами (я знаю, что база данных начинается с 2018-01-05), поэтому я использую 2018-01-01 как самую низкую дату для самая нижняя граница И в левом соединении я использую getdate () + 1, чтобы иметь дату завтрашнего дня в качестве самой высокой границы:

Select '2018-01-01' as Date1, SellerID as Seller1, 0 as Sequence1  from Seller  Group by Seller
Union ALL
Select phonecalldate as Date1, SellerID as Seller1, 0 as Sequence1 from Seller  Where Selling = 'true' group by phonecalldate , SellerID , Sequence
) as Boundary1
Left JOIN (
Select * from (
Select getdate()+1 as Date2, SellerID as Seller2, 0 as Sequence2 from Seller    Group by Seller
Union ALL
Select phonecalldate as DateMatch2, SellerID as Seller2, Sequence as Sequence2 from Seller  Where Selling = 'true' ) as Boundary2 
ON Boundary1.Seller1 = Boundary2 .Seller2 and ((Boundary1.Date1 = Boundary2.Date2 and Boundary1.Sequence1 < Boundary2 .Sequence2) or (Boundary1.Date1 < Boundary2.Date2 )) 

Запрос возврата:

  • (первый запрос) Left Join (второй запрос)
  • 2018-01-01 - 100 - 0 - 2018-01-05 - 100 - 3
  • 2018-01-01 - 100 - 0 - 2018-01-10 - 100 - 4
  • 2018-01-01 - 100 - 0 - 2019-01-12 - 100 - 0
  • 2018-01-05 - 100 - 3 - 2018-01-10 - 100 - 4
  • 2018-01-05 - 100 - 3 - 2019-01-12 - 100 - 0
  • 2018-01-10 - 100 - 4 - 2019-01-12 - 100 - 0

Как получить только самое низкое значение для каждого продавца1, как это?

  • 2018-01-01 - 100 - 0 - 2018-01-05 - 100 - 3
  • 2018-01-05 - 100 - 3 - 2018-01-10 - 100 - 4
  • 2018-01-10 - 100 - 4 - 2019-01-12 - 100 - 0

Точно так же, как посчитать сумму между двумя датами ???? результат должен дать мне (ЭТО) Это то, что я действительно ищу !!

  • 2018-01-01 - 100 - 0 - 2018-01-05 - 100 - 3 (2)
  • 2018-01-05 - 100 - 3 - 2018-01-10 - 100 - 4 (5)
  • 2018-01-10 - 100 - 4 - 2019-01-12 - 100 - 0 (6)

Теперь у меня есть границы, я думаю, что я могу найти сколько: Selling = false между моим результатом.

У кого-нибудь есть лучший способ сделать этот запрос, чтобы получить это?

Спасибо

1 Ответ

0 голосов
/ 13 января 2019

Я бы хотел, чтобы эта часть была выполнена автором вопроса.

DECLARE @Seller TABLE (
  SellerID INT,
  phonecalldate DATE,
  [Sequence] INT,
  Selling INT CHECK(Selling IN(0, 1)),
  PRIMARY KEY (SellerID, phonecalldate, [Sequence])
);

INSERT @Seller(SellerID, phonecalldate, [Sequence], Selling)
VALUES
  (100, '20180105', 1, 0),
  (100, '20180105', 2, 0),
  (100, '20180105', 3, 1),
  (100, '20180105', 4, 0),
  (100, '20180105', 5, 0),
  (100, '20180110', 1, 0),
  (100, '20180110', 2, 0),
  (100, '20180110', 3, 0),
  (100, '20180110', 4, 1),
  (100, '20180110', 5, 0),
  (100, '20180110', 6, 0),
  (100, '20180110', 7, 0),
  (100, '20180110', 8, 0),
  (100, '20180110', 9, 0),
  (100, '20180110', 10, 0);

Данные, необходимые для получения желаемого результата, можно получить с помощью следующего запроса:

WITH
  a AS (
    SELECT
      SellerID,
      Selling,
      FORMAT(phonecalldate, 'yyyyMMdd') +
        FORMAT([Sequence], '00000000') AS dump,
      SUM(Selling) OVER
      (
        PARTITION BY SellerID
        ORDER BY phonecalldate, [Sequence]
      ) AS g
    FROM @Seller
  )
SELECT
  COUNT(*) AS PhoneCallQty,
  CAST(LEFT(MIN(dump), 8) AS DATE) AS StartDate,
  CAST(RIGHT(MIN(dump), 8) AS INT) AS StartSeq,
  CAST(LEFT(MAX(dump), 8) AS DATE) AS EndDate,
  CAST(RIGHT(MAX(dump), 8) AS INT) AS EndSeq
FROM a
WHERE Selling = 0
GROUP BY SellerID, g;

Выход:

+--------------+------------+----------+------------+--------+
| PhoneCallQty | StartDate  | StartSeq |  EndDate   | EndSeq |
+--------------+------------+----------+------------+--------+
|            2 | 2018-01-05 |        1 | 2018-01-05 |      2 |
|            5 | 2018-01-05 |        4 | 2018-01-10 |      3 |
|            6 | 2018-01-10 |        5 | 2018-01-10 |     10 |
+--------------+------------+----------+------------+--------+
...