Список создания запросов SQL Server не только TOP

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

На данный момент он основан на User_ID = 1, но мне нужно запустить для всех user_ID.

Кто-нибудь знает, как я могу изменить этот запрос?

Этот запрос должен выдавать список пользователей, которым предстоит игра, вместе с игрой, которую они должны.

  1. Список пользователей, которые не достигли своей игровой квоты на этот месяц, на основе выбранного ими пакета подписки и арендованного стола.
  2. Сравните этот список пользователей с их списком избранного и назначьте им игру в зависимости от того, какая игра является для них наивысшим приоритетом и по дате.
  3. Выбранная игра или игры должны быть в наличии, что необходимо сравнить с уровнями количества в таблице игр.

http://sqlfiddle.com/#!3/48bc1/1 введите здесь описание изображения

Ожидаемый результат от этого sql Fiddle: -

Leona Hill Blur XBOX 360
Rodney Hill Blur XBOX 360
Gillian Hill Formal 1 PS3
Gillian Hill Need for Speed XBOX 360

person Alexandria    schedule 27.04.2014    source источник
comment
. . Было бы полезно, если бы вы отредактировали свой вопрос и добавили образцы данных и желаемые результаты.   -  person Gordon Linoff    schedule 27.04.2014
comment
Боже мой, это какой-то сценарий. Не могли бы вы сузить свою проблему до 2 или 3 таблиц и каковы характеристики этого нового списка, который вам нужен, я очень сомневаюсь, что кто-то захочет пройти через эти 10- Скрипт 15 таблиц, чтобы ответить на ваш вопрос   -  person M.Ali    schedule 27.04.2014
comment
Гордон, вы должны увидеть скрипку sql, там около 15 таблиц с некоторыми примерами данных, удачи с этим приятелем :)   -  person M.Ali    schedule 27.04.2014
comment
@ М.Али. . . Я не собираюсь приближаться к этому. У меня нет оснований думать, что текущий метод является разумным способом решения имеющейся проблемы, если сама проблема не сформулирована.   -  person Gordon Linoff    schedule 27.04.2014
comment
Извините, я переделаю скрипт sql   -  person Alexandria    schedule 27.04.2014
comment
Вы неправильно поняли, мы просто хотим знать, каков ожидаемый результат, даже если нам придется повторить весь запрос   -  person Ryx5    schedule 27.04.2014
comment
@ Ryx5 Ryx5 Я обновил вопрос со всеми подробностями, которые вы задали, и лучше поиграйте в sql с изображением базы данных.   -  person Alexandria    schedule 27.04.2014


Ответы (1)


Это основано на данных в SQLFiddle - я заметил, что там нет столбца «LASTNAME».

Кроме того, я все еще перевариваю, правильно это или нет, но, пожалуйста, посмотрите.

/* Find the next games for a user to rent */
/* You cant do it in one swoop because each customers choice will affect the next one */
/* and you have to insert the result into the rentals in between. */

SELECT FIRSTNAME, GAME_NAME, GAME_PLATFORM
FROM [Games]
JOIN (SELECT [Favourites_ID], [User_ID], [Game_name], [Game_platform],
  [Priority], [Priority_level], [DatePicked],
  RANK() OVER (PARTITION BY [User_ID] ORDER BY [Priority], [DatePicked]) AS Rank
 FROM Favourites) [Favourites]
  ON [Favourites].[Game_name] = [Games].[Name]
JOIN [Users]
  ON [Users].[User_ID] = [Favourites].[User_ID]
JOIN (SELECT [User_ID], MIN([RemainingRentable]) RemainingRentable FROM (
      /* Remaining rentable at a time */
      SELECT
        [Subscriptions].[Game_at_a_time] - (
          /* Number of games currently rented by the customer */
          SELECT COUNT(*) AS [CurraentlyRented]
          FROM [Rentals]
          WHERE [Rentals].[Date_returned] IS NULL
            AND [Users].[User_ID] = [Rentals].[User_ID]
        ) AS RemainingRentable,
      [Users].[User_ID]
      FROM [Users]
      JOIN [Subscriptions]
        ON [Users].[Subscription_ID] = [Subscriptions].[Subscription_ID]
      UNION
      /* Remaining rentable this month */
      SELECT
        [Subscriptions].[Max_games] - (
          /* Number of total games rented by the customer this month */
          SELECT COUNT(*) AS [RentedThisMonth]
          FROM [Rentals]
          WHERE MONTH([Rentals].[Date_rented]) = MONTH(GETDATE())
            AND YEAR([Rentals].[Date_rented]) = MONTH(GETDATE())
            AND [Users].[User_ID] = [Rentals].[User_ID]
        ) AS RemainingRentable,
      [Users].[User_ID]
      FROM [Users]
      JOIN [Subscriptions]
        ON [Users].[Subscription_ID] = [Subscriptions].[Subscription_ID] ) A
      GROUP BY [User_ID]
    ) Rentability 
  ON [Rentability].[User_ID] = [Users].[User_ID]
WHERE 
[Games].[Quantity] > (
    /* Number of currently rented copies */
    SELECT COUNT(*) FROM [Rentals]
    WHERE [Games].[Game_barcode] = [Rentals].[Game_barcode]
      AND [Rentals].[Date_returned] IS NULL
  )
AND Rank <= RemainingRentable
GROUP BY FIRSTNAME, GAME_NAME, GAME_PLATFORM
person Zak    schedule 27.04.2014
comment
Это 95%, Зак :) .. Когда я запускаю его, он дает мне Джиллиан 3 игры, которые нужно опубликовать здесь, однако, глядя на таблицу арендных ставок, у нее уже есть одна игра, а у вас может быть только 2 игры максимум за раз. Таким образом, запрос не принимает во внимание таблицу аренды. Будет ли это что-то вроде арендной платы count(*), где date_returned IS NULL, а IF count меньше, чем назначенная игра. Возможно, это должна быть первая часть запроса. - person Alexandria; 27.04.2014
comment
Я думаю, нам нужен подзапрос с увеличивающимся счетчиком (рангом) для каждого пользователя - и брать только те игры, где ранг =‹ RemainingRentable - person Zak; 27.04.2014
comment
Добавлен Priority ‹= RemainingRentable в качестве фильтра... Я предполагаю, что Priority часто обновляется, поэтому его список всегда начинается с "1" для каждого пользователя... - person Zak; 27.04.2014
comment
Да, пользователь обновляет свой приоритет игры, когда хочет, когда он выбирает его изначально, он получает приоритет 2, который является средним уровнем, 1 — высоким и 3 — низким. - person Alexandria; 27.04.2014
comment
Я думаю, что последнее редактирование должно решить проблему. Я оценил каждую любимую игру по уровню приоритета и времени, когда она была выбрана (раньше рейтинг был выше)... Надеюсь, это поможет. - person Zak; 27.04.2014
comment
Выглядит хорошо, Зак. Я только что попробовал это в Visual Studio, и он говорит, что конструкция или оператор OVER SQL не поддерживаются :( - person Alexandria; 27.04.2014
comment
Какую версию ты используешь? - person Zak; 27.04.2014
comment
2010 Professional, о нет, пожалуйста, скажите мне, что он все еще будет работать. Он отлично работает на SQL Fiddle именно то, что мне нужно. - person Alexandria; 28.04.2014
comment
Я думаю, что это просто ваше окно запроса, которое его не поддерживает. У вас есть SQL Server Management Studio? Сама база данных должна поддерживать этот запрос. stackoverflow .com/questions/5784072/ - person Zak; 28.04.2014
comment
Нет, есть только визуальная студия. Я помещаю ваш запрос в sqldatasource, и когда я его выполняю, он дает мне эту ошибку. - person Alexandria; 28.04.2014
comment
Если вы определяете этот запрос как представление, а затем выбираете из представления, оно должно работать. - person Zak; 28.04.2014
comment
Простите за боль, вы уже очень помогли мне, и я действительно ценю это, но я никогда не использовал просмотр и даже не слышал о нем, чтобы сказать вам правду. Кто они такие? - person Alexandria; 28.04.2014
comment
Все в порядке, все работает :D :D :D Большое спасибо, вы даже не представляете, как долго я рвал на себе волосы с этим запросом - person Alexandria; 28.04.2014