SQL вроде для похожих заказов год назад - PullRequest
0 голосов
/ 20 февраля 2012

У меня есть проблема, при которой я пытаюсь идентифицировать заказы клиентов, где

  1. У клиента был заказ в том же месяце год назад и в этом месяце.
  2. У клиента был заказ год назад в этом месяце, но не в этом месяце
  3. У клиента был заказ в этом месяце, но не год назад.

Мои данные выглядят так.

CustomerID      Month   Year    Value
1                 2     2011       18
1                 2     2012       16
2                 1     2011       15
3                 1     2012       13

Из этого я ожидаю возврата (для каждого критерия выше)

  1. Строки 1 и 2
  2. Строка 3
  3. Строка 4

Я уверен, что для этого должно быть элегантное решение, но сегодня я не вижу его!

Пока что я дошел до этого, но получаюмного дубликатов я упускаю что-то очевидное?

;with t (ID, Yr, Mo) 
As
(
    Select ID, TransactionYearFK, TransactionMonthFK
    From dbo.MyData
)

Select * 
From t tC
        Full Outer Join t tL On tC.ID = tL.ID And tC.Mo = tL.Mo And tL.Yr = tC.Yr - 1

Where Coalesce(tC.ID, tL.ID) = 21110
Order By tC.Yr, tC.Mo

1 Ответ

2 голосов
/ 20 февраля 2012

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

  1. Год должен быть не ранее последнего.

  2. Месяц должен совпадать с текущим месяцем, будь то текущий или прошлый год.

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

SELECT
  CustomerID,
  ThisYear = COUNT(CASE Year WHEN YEAR(GETDATE()) THEN 1 ELSE NULL END),
  LastYear = COUNT(CASE Year WHEN YEAR(GETDATE()) THEN NULL ELSE 1 END)
FROM data
WHERE Year >= YEAR(GETDATE()) - 1
  AND Month = MONTH(GETDATE())
GROUP BY
  CustomerID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...