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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2015, 04:16   #1
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию T-SQL Выражение CASE

Здравствуйте ребята . Я опять зависаю на одну месте и не понял где я допускаю ошибки , Попробую объяснить подробно. Работаю на MS SQL Server . У меня есть

Код:
----Таблица для выдача кредитов --
create table Creadit
(
 c_id int identity(1,1) primary key,
 c_first_last_name nvarchar(30) not null, --ФИО
 c_date_credit datetime default getdate(), -- Дата выдача кредитов
 c_money money not null, -- Денег - кредит 
 c_day integer, -- День до пустим он забирает на 10 день или на 15 
 c_procent integer, -- На какой период это денег он забирает ! на 10 день  или на 20 
);
для наглядности добавляю несколько клиент
Код:
 insert into Creadit(c_first_last_name, c_date_credit, c_money , c_day, c_procent)
 values(N'Иванов Иване','2015-06-10 01:45:40.000', 200,10,10);
 insert into Creadit(c_first_last_name, c_date_credit, c_money , c_day, c_procent)
 values(N'Васия пупкин','2015-06-10 01:45:40.000', 250,10,10);
 insert into Creadit(c_first_last_name, c_date_credit, c_money , c_day, c_procent)
 values(N'Максим Микифоров','2015-06-10 01:45:40.000', 250,10,10);
 
 select * from Creadit
Задача ставил "Бухгалтер" он говорить так:
Бывает что клиенты приходит через день или через два дня
и он может добавить несколько раз деньги ! Все это деньги который он добавляет потом-после выдача кредитов
он хочет увидит на "отдельное поле ". До пустим клиент добавляет на второе день 20 руб, потом через день 30 руб
и все это добавление деньги должен просуммированы , еще что было возможности (посмотреть детально) на каком дате что он добавил !
Код:
 -- для такого добавление "Создаю еще таблицу" ----
 create table Dobavka_Credit
 (
  d_id int identity(1,1),
  d_date datetime default getdate(),
  d_Money money,
  d_CreditID int not null,
  constraint FK_Dobavka_Credit  foreign key(d_CreditID) references Creadit(c_id)
  on delete cascade
 )
Допустим "Иванов Иване" решил добавить 50 руб на своего кредита второе день , на данный момент не имеет значения когда он добавил
Код:
 insert into Dobavka_Credit(d_Money, d_CreditID)  values(50,1)
и решил еше добавить 40 руб
Код:
 insert into Dobavka_Credit(d_Money, d_CreditID)  values(40,1)
Для того что уважаемы Бухгалтер ) хочеть посмотреть все добавление деньги просуммировать отдельное поле , Я начинаю писать
Код:
 SELECT *, ISNULL((SELECT SUM(d_Money) 
                   FROM Dobavka_Credit D
                   WHERE C.c_id=D.d_CreditID
           ),0) AS [Dobavka]
 FROM Creadit C
Пока все нормально , он хотел таком виде увидит это данных. Тоже магу показать тот клиенти который добавили на свой кредит деньги и когда они добавили
Код:
 SELECT C.c_first_last_name as ФИО, C.c_date_credit as Дата_выдачы, C.c_money as Выданы_деньги , C.c_day as День, C.c_procent as Процент,
 D.d_date as Дате_добавления, D.d_Money as Добавление_сумма 
 FROM Creadit C
 INNER JOIN Dobavka_Credit D
 ON C.c_id=D.d_CreditID
Вопрос: Как суммировать C.c_money + AS [Dobavka] потом DATEDIFF(DAY, C.c_date_credit, GETDATE()) ) > C.c_day и ISNULL((SELECT SUM(d_Money) FROM Dobavka_Credit D WHERE C.c_id=D.d_CreditID),0)>0 тогда на эту C.c_money + AS [Dobavka] добавил 10% каждого после 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) +
           ( (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
Изображения
Тип файла: jpg 1.jpg (25.3 Кб, 43 просмотров)
Тип файла: jpg 2.jpg (62.8 Кб, 47 просмотров)
Тип файла: jpg 3.jpg (84.6 Кб, 118 просмотров)
Тип файла: jpg 4.jpg (101.4 Кб, 117 просмотров)

Последний раз редактировалось xxbesoxx; 22.06.2015 в 04:21.
xxbesoxx вне форума Ответить с цитированием
Старый 22.06.2015, 07:15   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А ты не хочешь сделать хранимую процедуру, в которой будешь в цикле прокатываться по подобному запросу, формируя в результате набор данных?
Может быть в функции будет проще описать вычисления, которые сложно упихнуть в SQL запрос?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.06.2015, 07:35   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
select c.money, --основная сумма
 d.dop, --- доплнительная сумма
(c.money + isnull(d.dop,0)) /100* p,  --сумма начисленных процентов
(c.money + isnull(d.dop,0)) /100* (p+100) --сумма начисленных процентов c основным долгом (100% это основной долг!!!)

from bases --данные по основному долгу
left join ( -- данные по дополнительному 
              select sum(d.money) as sdop, d.creditid  
              from dobavka as d
              where -- если нужен фильтр по дате
              group by d.creditid
          ) as d on d.creditid =bases
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 22.06.2015, 09:48   #4
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
А ты не хочешь сделать хранимую процедуру, в которой будешь в цикле прокатываться по подобному запросу,
1) Огромное вам спасибо за внимание, много раз помогли .
2) Друг что мне даст "хранимую процедуру" ?
Код:
 create proc Name_proc
 with encryption -- зашитим код 
 as
 begin
 /*  это задача должен решать SELECT  да ?*/
 end;
На предыдущие теме http://programmersforum.ru/showthread.php?t=264574 вы меня помогли очень хорошо работал case when vidan_deng money<=50 then А сейчас не читает правильно и почему? А так я могу сложить числа и почитать процент , На пример
Код:
select 100 as C_Money, 50 as D_dobavka, 
   cast(100+50 as money) / 100 *10 +  cast(100+50 as money) as Klient_Doljen_zaplotit
А на моего таблице не спасает cast
Цитата:
Может быть в функции будет проще описать вычисления,
Код:
CREATE FUNCTION Name_function()
RETURNS TABLE -- возврашать таблицу
with encryption -- Зашита 
AS
     RETURN (select -- Здесь тоже select должен все почитат );
GO
Цитата:
проще описать вычисления, которые сложно упихнуть в SQL запрос?
Как будет это проще ? Я на это мучаю

evg_m Я прошу прошения , идея понятно, Но не магу написать так что правильно работал.... Пожалуйста помогите написать это вычисления сто правильно рабогтал

Последний раз редактировалось xxbesoxx; 22.06.2015 в 09:54.
xxbesoxx вне форума Ответить с цитированием
Старый 22.06.2015, 10:17   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ай яй яй... Учится не хочешь ))
Код:
CREATE FUNCTION foo ()
RETURNS @retFindReports TABLE 
(
 c_first_last_name nvarchar(30) not null, --ФИО
 c_date_credit datetime getdate(), -- Дата выдача кредитов
 c_money money, -- Денег - кредит 
)

AS
BEGIN
DECLARE vendor_cursor CURSOR FOR
  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) +
           ( (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

DECLARE 
 @c_first_last_name nvarchar(30) not null, --ФИО
 @c_date_credit datetime getdate(), -- Дата выдача кредитов
 @c_money money, -- Денег - кредит 
 @c_day integer, -- День до пустим он забирает на 10 день или на 15 
 @c_procent integer -- На какой период это денег он забирает ! на 10 день  или на 20 

FETCH NEXT FROM vendor_cursor 
INTO 
 @c_first_last_name nv,
 @c_date_credit ,
 @c_money , 
 @c_day , 
 @c_procent
;

WHILE @@FETCH_STATUS = 0
BEGIN
 insert into @retFindReports
 @c_first_last_name nv,
 @c_date_credit ,
 @c_money+(@c_day/10)*100/10,  --Тут высчитывается процент, формула неточная.


FETCH NEXT FROM vendor_cursor 
INTO 
 @c_first_last_name nv,
 @c_date_credit ,
 @c_money , 
 @c_day , 
 @c_procent
;
end;

CLOSE vendor_cursor;
DEALLOCATE vendor_cursor;

Return;
Вот что я тебе предлагал.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.06.2015, 10:27   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
идея понятно, Но не магу написать так что правильно работал....
В чем именно проблема?

определить данные исходного кредита (select * from bases)
правильно посчитать сумму добавки (select id_credit, sum() ... group by id_credit )
правильно рассчитать сумму процентов (формула расчета )

(c.money + d.dop) + (c.money +d.dop)/100 *10
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 22.06.2015 в 10:34.
evg_m на форуме Ответить с цитированием
Старый 22.06.2015, 15:11   #7
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
В чем именно проблема?
Нечего не понял , зачем (select id_credit, sum() ... group by id_credit )
Код:
правильно рассчитать сумму процентов (формула расчета )
(c.money + d.dop) + (c.money +d.dop)/100 *10
Да вы прав на 100% Я тоже понимаю , Но, у меня было логические ошибка, когда уставший надо все отложить и отдыхать . код который у меня на первое посте было личное это --( (C.c_money+(SELECT SUM(d_Money) FROM Dobavka_Credit D WHERE C.c_id=D.d_CreditID) /100* C.c_procent )) * смотрите
Код:
  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) *
           --( (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
Огромное спасибо
Цитата:
Stilet Ай яй яй... Учится не хочешь ))
Друг, почему вы меня пугайте таким кодом ? )
1) CREATE FUNCTION это знаю да
2) DECLARE vendor_cursor CURSOR FOR .... DECLARE vendor_cursor CURSOR FOR Это не знаю , не когда не применял , Буду изучать
3) FETCH NEXT FROM vendor_cursor тоже не понял , тоже буду изучать
Огромное вам человеческое спасибо
Изображения
Тип файла: jpg T_Z.jpg (82.5 Кб, 113 просмотров)

Последний раз редактировалось xxbesoxx; 22.06.2015 в 20:36.
xxbesoxx вне форума Ответить с цитированием
Старый 22.06.2015, 16:27   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
почему вы меня пугайте таким кодом ?
Да ну... Не такой уж и страшный. Есть у меня процедуры, которые занимали 100 и более строк. Кстати такая упаковка в функцию на сервер очень даже себя оправдала - не нужно переделывать было клиентов, если понадобилось изменять расчеты из БД. Потому и рекомендую.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.06.2015, 16:56   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Потому и рекомендую.
Оно (cursor) медленное, сильно. Запросом на порядок быстрее. Как разовое - да, как постоянное - плохо.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.06.2015, 17:19   #10
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Stilet и Аватар Я вас очень уважаю , вы меня много раз помогли, показали много чего, и не только меня, Я ваши помощь не забуду и "родина вас не забудет"
Это запрос я решил вставить в теле функций можно еще представление view но буду применять функция
Код:
CREATE FUNCTION Name_function()
RETURNS TABLE -- возврашать таблицу
with encryption -- Зашита код , что криворукий не трогали и не увидели нечено
AS
  RETURN 
 ( 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()- C.c_day) 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) *
           --( (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 );
 GO
Я так думаю! Преимущество в том что Я магу работать с эту функций как таблица
Код:
SELECT *
FROM  Name_function() C
WHERE C.c_id = 2

Последний раз редактировалось xxbesoxx; 22.06.2015 в 17:33.
xxbesoxx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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