#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
Примеры:
- клиент
name 1
может быть назначенgroup 1
, потомуprice
что меньше или равноlimit
. - Клиенту
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.