Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2015, 17:39   #11
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Оно (cursor) медленное, сильно
Это смотря как курсор делать и из чего )
Цитата:
родина вас не забудет
Мою родину молния нашла еще в 90-м )))
Так и помер... Митрич )))
Цитата:
Преимущество в том что Я магу работать с эту функций как таблица
Не только в этом. Функция выполняется быстрее запроса, потому что скомпилирована заранее. Аватар прав в одном: Курсор кушает ресурс. Во всем остальном он имеет преимущество.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.06.2015, 18:01   #12
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Не только в этом. Функция выполняется быстрее запроса, потому что скомпилирована заранее. Аватар прав в одном: Курсор кушает ресурс. Во всем остальном он имеет преимущество.
Огромное спасибо , буду знать на будущее
xxbesoxx вне форума Ответить с цитированием
Старый 22.06.2015, 18:09   #13
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Это смотря как курсор делать и из чего
Не важно из чего и как, вернее важно для курсора, один и тот же можно сделать очень-очень медленным и просто очень медленным. При любых обстоятельствах навигационный подход уступает реляционному как по ресурсам, так и по скорости
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.06.2015, 18:17   #14
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
При любых обстоятельствах навигационный подход уступает реляционному как по ресурсам, так и по скорости
Ну не совсем так )
Можно конечно назвать это мифом, но современные (кажется с 2008) сиквелы умеют работать с запросом не создавая его сразу, а проходя по реляционной схеме по мере необходимости, как это делает LINQ.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.06.2015, 21:45   #15
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Это код работает на каждого 10-день
Код:
 
  SELECT *, ISNULL((SELECT SUM(d_Money) 
                   FROM Dobavka_Credit D
                   WHERE C.c_id=D.d_CreditID
           ),0) AS [Dobavka], DATEDIFF(DAY, c_date_credit, GETDATE()) as [Колво_день],
           CASE
           WHEN (SELECT DATEDIFF(DAY, C.c_date_credit, GETDATE()) ) > C.c_day AND 
           ISNULL((SELECT SUM(d_Money) FROM Dobavka_Credit D WHERE C.c_id=D.d_CreditID),0)>0 THEN
           ( (C.c_money+(SELECT SUM(d_Money) FROM Dobavka_Credit D WHERE C.c_id=D.d_CreditID)) ) + 
           ( (C.c_money+(SELECT SUM(d_Money) FROM Dobavka_Credit D WHERE C.c_id=D.d_CreditID) ) /100* C.c_procent) *
           (DATEDIFF(DAY,C.c_date_credit,GETDATE())/C.c_day )
           END AS [Должен] 
 FROM Creadit C
Еще такой вопрос: Я хочу при оформление кредита сразу вычислить процент + c_money+ (SELECT SUM(d_Money) FROM Dobavka_Credit D WHERE C.c_id=D.d_CreditID) , Может клиент добавить денег и может не добавить .
Хочу все по шагом проходить
1)Код который у меня после есть после WHEN копирую, пишу ELSE
Код:
           ELSE
           ( (C.c_money+(SELECT SUM(d_Money) FROM Dobavka_Credit D WHERE C.c_id=D.d_CreditID)) ) + 
           ( (C.c_money+(SELECT SUM(d_Money) FROM Dobavka_Credit D WHERE C.c_id=D.d_CreditID) ) /100* C.c_procent) *
           (DATEDIFF(DAY,C.c_date_credit,GETDATE())/C.c_day )
работает не правильно
Код:
  SELECT *, ISNULL((SELECT SUM(d_Money) 
                   FROM Dobavka_Credit D
                   WHERE C.c_id=D.d_CreditID
           ),0) AS [Dobavka], DATEDIFF(DAY, c_date_credit, GETDATE()) as [Колво_день],
           CASE
           WHEN (SELECT DATEDIFF(DAY, C.c_date_credit, GETDATE()) ) > C.c_day AND 
           ISNULL((SELECT SUM(d_Money) FROM Dobavka_Credit D WHERE C.c_id=D.d_CreditID),0)>0 THEN
           ( (C.c_money+(SELECT SUM(d_Money) FROM Dobavka_Credit D WHERE C.c_id=D.d_CreditID)) ) + 
           ( (C.c_money+(SELECT SUM(d_Money) FROM Dobavka_Credit D WHERE C.c_id=D.d_CreditID) ) /100* C.c_procent) *
           (DATEDIFF(DAY,C.c_date_credit,GETDATE())/C.c_day )
           ELSE
           ( (C.c_money+(SELECT SUM(d_Money) FROM Dobavka_Credit D WHERE C.c_id=D.d_CreditID)) ) + 
           ( (C.c_money+(SELECT SUM(d_Money) FROM Dobavka_Credit D WHERE C.c_id=D.d_CreditID) ) /100* C.c_procent) *
           (DATEDIFF(DAY,C.c_date_credit,GETDATE())/C.c_day )
           END AS [Должен] 
 FROM Creadit C
Скажите пожалуйста , где я допускаю ошибка ? Где то в "круглые скобках" или где ? если это код работает до ELSE правильно а почему потом не правильно ?
Изображения
Тип файла: jpg 22.jpg (78.5 Кб, 144 просмотров)

Последний раз редактировалось xxbesoxx; 23.06.2015 в 21:59.
xxbesoxx вне форума Ответить с цитированием
Старый 23.06.2015, 23:36   #16
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

в SQL действует следующее правило сложения (и не только)
6 + null = null
поэтому надо так
6 + isnull(nill,0) =6
а если добавок не было, то их сумма как раз NULL!
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 23.06.2015 в 23:38.
evg_m вне форума Ответить с цитированием
Старый 24.06.2015, 08:19   #17
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
в SQL действует следующее правило сложения (и не только)
6 + null = null
поэтому надо так
6 + isnull(nill,0) =6
а если добавок не было, то их сумма как раз NULL!
На данный момент это не причем давайте я select выберу простой число для теста
Код:
select CAST('2015-06-24 00:26:38.157' as date) [date_credit],
       cast(200 as money) [Vidani kredit], cast(50 as money) [Dobavka],
       CAST(10 as int) [P.day],
       case
       when 
       (select DATEDIFF(DAY, CAST('2015-06-24 00:26:38.157' as date), GETDATE() ))> CAST(10 as int)  then
       (cast(200 as money)+ cast(50 as money) ) + (cast(200 as money)+ cast(50 as money) ) /100 * 10 *
       (DATEDIFF(DAY,CAST('2015-06-24 00:26:38.157' as date),GETDATE())/11)
       else
      (cast(200 as money)+ cast(50 as money) ) + (cast(200 as money)+ cast(50 as money) ) /100 * 10 *
       (DATEDIFF(DAY,CAST('2015-06-24 00:26:38.157' as date),GETDATE())/11)
       end [Должен]
или давайте напишу "точно такой число" что у меня в таблице
Код:
select GETDATE()
--------------------------
select CAST('2015-06-24 00:26:38.157' as date) [date_credit],
       cast(200 as money) [Vidani kredit], cast(90 as money) [Dobavka],
       CAST(10 as int) [P.day],
       case
       when 
       (select DATEDIFF(DAY, CAST('2015-06-24 00:26:38.157' as date), GETDATE() ))> CAST(10 as int)  then
       (cast(200 as money)+ cast(90 as money) ) + (cast(200 as money)+ cast(90 as money) ) /100 * 10 *
       (DATEDIFF(DAY,CAST('2015-06-24 00:26:38.157' as date),GETDATE())/11)
       else
      (cast(200 as money)+ cast(90 as money) ) + (cast(200 as money)+ cast(90 as money) ) /100 * 10 *
       (DATEDIFF(DAY,CAST('2015-06-24 00:26:38.157' as date),GETDATE())/11)
       end [Должен]
работаеть не правильно
Изображения
Тип файла: jpg ыыы.jpg (114.5 Кб, 147 просмотров)

Последний раз редактировалось xxbesoxx; 24.06.2015 в 08:32.
xxbesoxx вне форума Ответить с цитированием
Старый 24.06.2015, 08:34   #18
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

DATEDIFF(DAY,CAST('2015-06-24 00:26:38.157' as datetime),GETDATE())/11 = 0
и
DATEDIFF(DAY,CAST('2015-06-20 00:26:38.157' as datetime),GETDATE())/11 = 0

и вообще это деление нацело, остаток отбрасывается
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.06.2015, 08:55   #19
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
и вообще это деление нацело, остаток отбрасывается
Правильно , проверяю
Код:
select (DATEDIFF(DAY,CAST('2015-06-24 00:26:38.157' as date),GETDATE())/11)
да, =0
Как делать так что , прямо при оформления сразу вычислить процент+ (200 as money) [Vidani kredit] ???
-------------------------------------------------------------------------------------------------------------------------
Но это "0" тоже не причем . У меня в логике ошибка , делаю еше тесть

1)
Код:
create table T1
(
 t_id int identity(1,1),
 t_name nvarchar(30),
 t_date datetime,
 t_money money,
 t_proc integer
)
2)
Код:
insert into T1(t_name, t_date, t_money, t_proc ) values(N'что то', getdate(), 50,10)
insert into T1(t_name, t_date, t_money, t_proc ) values(N'что то', getdate(),60,10)
insert into T1(t_name, t_date, t_money, t_proc ) values(N'что то', getdate(),80,10)
3) Проверяю select (DATEDIFF(DAY,t_date,GETDATE())/10) from T1 =0

4) начинаю писать CASE
Код:
select *,
 case
 when (select DATEDIFF(DAY, t_date, GETDATE()) ) > t_proc then  
 (t_money + t_money/100*10) +(t_money /100*10) *(DATEDIFF(DAY,t_date,GETDATE())/10)
 else
 (t_money + t_money/100*10) +(t_money /100*10) *(DATEDIFF(DAY,t_date,GETDATE())/10)
 end as [Doljen]
from T1
и все правильно работаеть ! Получается дела не "0" У меня логика написано не правильно ............ надо его изменить "как на это примере"
Изображения
Тип файла: jpg 77.jpg (103.7 Кб, 65 просмотров)

Последний раз редактировалось xxbesoxx; 24.06.2015 в 10:18.
xxbesoxx вне форума Ответить с цитированием
Старый 24.06.2015, 09:38   #20
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Вообще-то там достаточно убрать лишние скобки
Код:
SELECT CAST(200+50+CAST(200+50 AS float)/100*10*DATEDIFF(DAY,CAST('2015-06-22 00:26:38.157' as datetime),GETDATE())/11 AS NUMERIC(15,2))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal. Арифметическое выражение. Решить квадратное уравнение и посчитать выражение, используя вычисленные корни. dauletsergazin Паскаль, Turbo Pascal, PascalABC.NET 4 13.11.2017 11:55
CASE(C++) trans967 Помощь студентам 1 05.11.2013 20:23
Перемещение из case 1 в case 2(switch(), язык Си) Павел_95 Помощь студентам 13 11.01.2013 14:18
Запрос с CASE переделать в запрос с PIVOT (MS SQL Server 2005) Машуля SQL, базы данных 4 06.05.2010 21:09