Ваша реклама могла б бути тут!
1 млн переглядів на місяць!
Google Page Rank: 5

Sql кто разбираеться что можете подсказать я на этом примере учусь

🔴 17:10 Повітряна тривога в Харків.обл.
Статус: Offline
Реєстрація: 20.03.2010
Повідом.: 144
  • 🔴 17:10 Повітряна тривога в Харків.обл.
  • #1
Sql кто разбираеться что можете подсказать я на этом примере учусь

Исходные данные:
• таблицы CurrentDay (содержит самые свежие данные) и PreviousDay (содержит вчерашние данные). Скрипт для создания этих таблиц и пример содержимого приведен ниже.
• поле ID – уникальный внутренний идентификатор.
• поле ssn – уникальное поле для определения записи по клиенту, например идентификационный номер.
• val – остаток денег на счете клиента на момент который определяет поле CheckDate.

Необходимо написать запрос, который проставит в поле CurrentStatus таблицы CurrentDay следующие значения:
a. 1 – если вчера существовал такойже ssn с таким же значением val,
b. 2 – если вчера существовал такой же ssn и его значение val было больше, чем сегодня,
c. 3 - если вчера существовал такой же ssn и его значение val было меньш,е чем сегодня,
d. 4 – если такого ssn вчера не существовало (т.е. это новая запись).

Данный запрос должен быть выполнен одним оператором UPDATE, и содержать не более одного соединения между таблицами.
 
  • 🔴 17:10 Повітряна тривога в Харків.обл.
  • #2
И что не получается ? что пробовал писать ? какие ошибки ?
 
  • 🔴 17:10 Повітряна тривога в Харків.обл.
  • #3
Как вариант:

Код:
update currentDay cd
   set currentStatus = (select case
                                 when count(ssn) = 0 then
                                   4
                                 else
                                   case
                                     when max(val) = cd.val then
                                       1
                                     when max(val) > cd.val then
                                       2
                                     when max(val) < cd.val then
                                       3
                                   end 
                               end  
                          from lastDay
                         where ssn = cd.ssn)
 
  • 🔴 17:10 Повітряна тривога в Харків.обл.
  • #4
Сообщение 102, уровень 15, состояние 1, строка 1
Неправильный синтаксис около конструкции "cd".

тогда может подскажите или ссылку дадите как можно в запросах использовать if for и др. условные операторы и такую штуку нельзя делать (sql 2005 )

тогда может подскажите или ссылку дадите как можно в запросах использовать if for и др. условные операторы или такую штуку нельзя делать (sql 2005 )
 
  • 🔴 17:10 Повітряна тривога в Харків.обл.
  • #5
В MS SQL 2005 мой запрос должен работать, если структура таблиц соответствует описанию в первом посте.

тогда может подскажите или ссылку дадите как можно в запросах использовать if for и др. условные операторы или такую штуку нельзя делать (sql 2005 )

Спроси у google:
Код:
ms sql 2005 case clause
 
  • 🔴 17:10 Повітряна тривога в Харків.обл.
  • #6
В MS SQL 2005 мой запрос должен работать, если структура таблиц соответствует описанию в первом посте.

ASokol, Вы не правы.
Синтаксис Update не позволяет использовать алиас для таргет таблицы.
Ну по крайней мере синтаксис Update в SQL Server 2005/2008

Код:
update currentDay
   set currentStatus = (select case
                                 when count(ssn) = 0 then
                                   4
                                 else
                                   case
                                     when max(val) = currentDay.val then
                                       1
                                     when max(val) > currentDay.val then
                                       2
                                     when max(val) < currentDay.val then
                                       3
                                   end 
                               end  
                          from lastDay
                         where ssn = currentDay.ssn)

так же не совсем понимаю зачем используются в Вашем запросе агрегаты? исходя из условия предполагаю что ssn уникален и будет всегда одна строка.
Если ssn не уникален и может быть множество значений с одним и тем же ssn то в условии ничего не сказано какой из них использовать, почему Вы используете именно максимальный а не скажем минимальный или средний арифметический?
 
  • 🔴 17:10 Повітряна тривога в Харків.обл.
  • #7
ASokol, Вы не правы.
Синтаксис Update не позволяет использовать алиас для таргет таблицы.
Ну по крайней мере синтаксис Update в SQL Server 2005/2008

Код:
update currentDay
   set currentStatus = (select case
                                 when count(ssn) = 0 then
                                   4
                                 else
                                   case
                                     when max(val) = currentDay.val then
                                       1
                                     when max(val) > currentDay.val then
                                       2
                                     when max(val) < currentDay.val then
                                       3
                                   end 
                               end  
                          from lastDay
                         where ssn = currentDay.ssn)

так же не совсем понимаю зачем используются в Вашем запросе агрегаты? исходя из условия предполагаю что ssn уникален и будет всегда одна строка.
Если ssn не уникален и может быть множество значений с одним и тем же ssn то в условии ничего не сказано какой из них использовать, почему Вы используете именно максимальный а не скажем минимальный или средний арифметический?


Вообще-то сказано, что ssn уникальный. Аггрегаты используются для того, чтобы получить count (ведь ssn может то и не быть). А использование max или min не играет роли: записей либо нет (null), либо одна. По поводу alias: не думал, что MS SQL не поймет, в Oracle такое работает.
 
  • 🔴 17:10 Повітряна тривога в Харків.обл.
  • #8
ну на случай если такого ssn нет я бы лучше использовал штатный isnull (NVL в случае Оракл). Просто использование агрегатов сбивает малость с толку.
И двойной кейс тоже не нужен

Код:
update currentDay
   set currentStatus = isnull((select case
                                        when val = currentDay.val then 1
                                        when val > currentDay.val then 2
                                        when val < currentDay.val then 3
                                       end
                               
                          from lastDay
                         where ssn = currentDay.ssn), 4)
 
  • 🔴 17:10 Повітряна тривога в Харків.обл.
  • #9
Тоже вариант. :)
 
  • 🔴 17:10 Повітряна тривога в Харків.обл.
  • #10
Тільки зареєстровані користувачі бачать весь контент у цьому розділі
 
  • 🔴 17:10 Повітряна тривога в Харків.обл.
  • #11
Вот такие тупоголовые и пытаются устроиться разработчиками БД к нам, а сами не в состоянии написать просто запрос самостоятельно :)
 
  • 🔴 17:10 Повітряна тривога в Харків.обл.
  • #12
а с чего ты решила что ТС собираеться устраиваться к вам, МУДРОлобая?
 
  • 🔴 17:10 Повітряна тривога в Харків.обл.
  • #13
Вот такие тупоголовые и пытаются устроиться разработчиками БД к нам, а сами не в состоянии написать просто запрос самостоятельно :)

Привет.Он ,наверное, молод и хорош собой.Именно у таких,когда с первого раза не получается,со временем появляется хороший потенциал.
Потом будет похаать и пахаать,пока опять не заставят что то писать.
По сути,дорогая,следует отметить,что с момента знакомства с кодами,парень уже пошел стремительно вверх,осваивая все новые и новые технологии костылевания.Я внемательно слежу за развитием события,не имеющего аналогов в современном мире.
 
Останнє редагування:
  • 🔴 17:10 Повітряна тривога в Харків.обл.
  • #14
ASokol, Вы не правы.
Синтаксис Update не позволяет использовать алиас для таргет таблицы.
Ну по крайней мере синтаксис Update в SQL Server 2005/2008
позволяет.

Код:
update dd
   set currentStatus = isnull((select case
                                        when ss.val = dd.val then 1
                                        when ss.val > dd.val then 2
                                        when ss.val < dd.val then 3
                                       end
                               
                          from lastDay AS ss
                         where ss.ssn = dd.ssn), 4)
from currentDay AS dd
вот так и в 2005 и в 2008 будет работать. Да и в прошлых версиях тоже. Как минимум с MS SQL 6,5 так работает.
 
Назад
Зверху Знизу