Получение записей путем проверки значений набора данных

#sql-server #sql-server-2008

Вопрос:

У меня есть два стола

        group
 --------- ------- 
| group   | limit |
 --------- ------- 
| group 1 | 100   |
| group 2 | 150   |
| group 3 | 200   |
 ----------------- 

     customer
 --------- ------ 
| name   | price |
 --------- ------ 
| name 1 | 90    |
| name 2 | 100   |
| name 3 | 190   |
 ---------------- 
 

Мне нужно назначить a group для a customer (только по одному group для каждого customer ) , глядя на price и limit

Примеры:

  1. клиент name 1 может быть назначен group 1 , потому price что меньше или равно limit .
  2. Клиенту name 2 нельзя назначить group 1 , потому price что он меньше или равен limit , но лимит уже был использован клиентом name 1 , в этом случае он должен быть назначен group 2

Ожидаемые результаты:

  --------- ------- --------- ------- 
| name    | price | group   | limit |
 --------- ------- --------- ------- 
| name 1  |  90   | group 1 | 100   |
| name 2  |  100  | group 2 | 150   |
| name 3  |  190  | group 3 | 200   |
 ----------------- --------- ------- 
 

Есть ли способ сделать это без цикла, выполнить эти проверки и вернуть данные в одном наборе данных?

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

Комментарии:

1. Итак, каковы будут ваши ожидаемые результаты по предоставленным вами данным? Боюсь, я не следую здесь логике.

2.Кроме того, в примере 1 вы указываете, что значение 90 name 1 может быть присвоено меньше или равно 100, но затем продолжаете говорить, что оно не name 2 может быть присвоено, так как 100 меньше или равно 100. Почему логика другая? И 90, и 100 меньше или равны 100, так почему же одно верно, а другое нет?

3. Привет @Larnu! Логика другая, потому что предел 100 group 1 уже установлен для клиента name 1 , и его новое значение будет равно 10 после обновления, и 10, в этом разница.

4. Однако вычитание price из limit никогда даже не упоминается в вашем вопросе… Похоже, вам действительно нужно здесь остановиться подробнее. Возможно , поможет оконный агрегат, но он доступен только в поддерживаемых версиях SQL Server.