Поворот в T-SQL на основе смещения даты - PullRequest
0 голосов
/ 06 октября 2009

Существует таблица с именем Orders, имеющая три столбца:

  • OrderID

  • Идентификатор_пользователь

  • OrderDate

Мне нужно знать, что за прошедшие X месяцев пользователи A разместили 1 заказ, пользователи B разместили 2 заказа, пользователи C разместили 3 заказа и т. Д.

Таким образом, выводом является таблица с полем MinDate, а затем столбцы для каждого количества заказов от 1 до N, например ::

declare @t table ( 
  MinDate datetime,
  o_1 int,
  o_2 int,
  o_3 int,
  o_4 int,
  ...
  o_N int
)

Каждое поле содержит количество уникальных клиентов (UserID's), которые разместили столько заказов между MinDate и текущей датой. Например, если в строке MinDate = '2009-09-01', то o_6 содержит количество клиентов, которые разместили 6 заказов в период с 1 сентября по настоящее время и т. Д.

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

Есть предложения? Дайте мне знать, если мое объяснение не имеет смысла ...

Ответы [ 2 ]

1 голос
/ 20 октября 2009
0 голосов
/ 06 октября 2009

Вот удар в это; часть, где это ломается для меня, является динамическим поворотом (другими словами, у Вас мог бы быть бесконечный диапазон заказов 1-N). Тем не менее, он может указать вам (или кому-то еще) в общем направлении.

DECLARE @Orders TABLE
    (
      OrderID INT ,
      UserID INT ,
      OrderDate SMALLDATETIME
    )

INSERT  INTO @Orders
        ( OrderID, UserID, OrderDate )
VALUES  ( 1, 1, '20090102' ),
        ( 2, 1, '20090102' ),
        ( 3, 2, '20090102' ),
        ( 4, 2, '20090102' ),
        ( 5, 2, '20090102' ),
        ( 6, 3, '20090102' ),
        ( 7, 4, '20090102' )

SELECT  *
FROM    ( SELECT    UserID ,
                    COUNT(OrderID) AS CountOrders
          FROM      @Orders o
          WHERE     OrderDate > '20090101'
          GROUP BY  UserID
        ) x PIVOT ( COUNT(UserID) FOR CountOrders IN ( [1], [2], [3], [4] ) ) AS p
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...