TSQL Имеющий предложение не работает должным образом с условием - PullRequest
0 голосов
/ 06 сентября 2018
DECLARE @ComparisonMonth DATE
SET @ComparsionMonth '09-01-2018'

SELECT 
    Date, Sales, CustomerID 
FROM
    Database1 t1
WHERE
    Date >= CASE 
               WHEN (SELECT MAX(Date) 
                     FROM Database1 t2 
                     INNER JOIN ON t1.PlayerID = t2.PlayerID) >= DATEADD(month, -4, @ComparisonMonth) 
                    AND (SELECT MAX(Date) 
                         FROM Database1 t2 
                         INNER JOIN ON t1.PlayerID = t2.PlayerID) < DATEADD(month, -1, @ComparsionMonth) 
                  THEN DATEADD(month, -4, @ComparisonMonth)
               WHEN (SELECT MAX(Date) 
                     FROM Database1 t2 
                     INNER JOIN ON t1.PlayerID = t2.PlayerID) >= DATEADD(month, -7, @ComparisonMonth) 
                    AND (SELECT MAX(Date) 
                         FROM Database1 t2 
                         INNER JOIN ON t1.PlayerID = t2.PlayerID) < DATEADD(month, -4, @ComparsionMonth) 
                  THEN DATEADD(month, -7, @ComparisonMonth)
            END
        AND Date < CASE 
                      WHEN (Select MAX(Date) from Database1 t2 INNER JOIN on t1.PlayerID=t2.PlayerID) >= DATEADD(month, -4, @ComparisonMonth) 
                           AND (Select MAX(Date) from Database1 t2 INNER JOIN on t1.PlayerID=t2.PlayerID) < DATEADD(month, -1, @ComparsionMonth)          
                         THEN DATEADD(month, -1, @ComparisonMonth)
                      WHEN (Select MAX(Date) from Database1 t2 INNER JOIN on t1.PlayerID=t2.PlayerID) >= DATEADD(month, -7, @ComparisonMonth) 
                           AND (Select MAX(Date) from Database1 t2 INNER JOIN on t1.PlayerID=t2.PlayerID) < DATEADD(month, -4, @ComparsionMonth) 
                         THEN DATEADD(month, -4, @ComparisonMonth)
                    END

    GROUP BY
        CustomerID, Date

По сути, я хочу показать только значения за определенный период в зависимости от того, когда клиент последний раз покупал товар. Например, если клиент последний раз покупал товар в течение последних 3 месяцев, я хочу принять все его транзакции за последние 3 месяца. Вместо этого я получаю транзакции от 6 месяцев для клиента, который последний раз приходил 3 месяца назад.

Большое спасибо за помощь и, пожалуйста, дайте мне знать, если вам нужны какие-либо разъяснения.

1 Ответ

0 голосов
/ 06 сентября 2018

Мое предложение - перестать пытаться достичь всего сразу.Разделите ваш запрос на:

1 Найдите нужных вам клиентов.Очень простой запрос с точным условием фильтрации:

DECLARE @Customers TABLE (CustomerID INT NOT NULL PRIMARY KEY, LastPurchase DATE, FirstTran DATE)

INSERT INTO @Customers(CustomerID, LastPurchase, FirstTran)
SELECT 
    CustomerID, MAX(Date), DATEADD(MM, -3, MAX(Date))
FROM Database1 d
WHERE d.date >= @ReportDate
GROUP BY CustomerID

2 Получите их транзакции.Теперь у вас снова есть хороший фильтр (предикат соединения) - CustomerID.Помогите серверу с фильтрацией большой таблицы - найдите абсолютно минимальную дату из собранных данных.

DECLARE @MinDate DATE

SELECT @MinDate = MIN(FirstTran)
FROM @Customers

SELECT d.*
FROM Database1 d
INNER JOIN @Customers c
on c.CustomerID = d.CustomerID
WHERE d.Date >= c.FirstTran
  AND d.Date >= @MinDate

Протестируйте свое решение, и если вам когда-нибудь придет какое-нибудь крошечное одношаговое решение - реорганизуйте этот код по своему усмотрению.

...