Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 как засунуть значение вычисляемого поля в переменную  [new]
bleksenlen
Member

Откуда:
Сообщений: 77
здрасти есть запрос на отображение всякой всячины в selest-E которого при помощи CASE WHEN (t.oc between 50 and 100) and (r.stzurn=1 or r.stzurn=0) THEN t.oc ELSE null END as itog формирую новое поле ВОПРОС Надо в этом же запросе для поля itog сделать еще поле cifra которое будет отображать данные на основе поля итог типа
CASE WHEN itog between 0 and 49 THEN 0 ELSE (
CASE WHEN itog between 50 and 54 THEN 1.0 ELSE (
CASE WHEN itog between 55 and 59 THEN 1.33 ELSE (
CASE WHEN itog between 60 and 64 THEN 1.67 ELSE (
CASE WHEN itog between 65 and 69 THEN 2.0 ELSE (
CASE WHEN itog between 70 and 74 THEN 2.33 ELSE (
CASE WHEN itog between 75 and 79 THEN 2.67 ELSE (
CASE WHEN itog between 80 and 84 THEN 3.0 ELSE (
CASE WHEN itog between 85 and 89 THEN 3.33 ELSE (
CASE WHEN itog between 90 and 94 THEN 3.67 ELSE 4 END
) END
) END
) END
) END
) END
) END
) END
) END
) END AS cifra
КОРОЧЕ ОН НЕ ЗНАЕТ ЧТО ТАКОЕ itog , НО ВМЕСТО itog ПОДСТАВИТЬ CASE WHEN (t.oc between 50 and 100) and (r.stzurn=1 or r.stzurn=0) THEN t.oc ELSE null END Я НЕМОГУ ТАК КАК ОН У МЕНЯ ОЧЕНЬ ЕМКИЙ НА САМОМ ДЕЛЕ И СОСТОИТ ИЗ МНОЖЕСТВА СТРОЧ ЧТО УВЕЛИЧИВАЕТ ЗАПРОС ДА БЕСПРЕДЕЛА. ВОПРОС ЧТО МОЖЕТЕ ПРЕДЛОЖИТЬ ДЛЯ РЕШЕНИЯ МОЕЙ ПРОБЛЕМЫ????
31 окт 11, 14:15    [11526518]     Ответить | Цитировать Сообщить модератору
 Re: как засунуть значение вычисляемого поля в переменную  [new]
Glory
Member

Откуда:
Сообщений: 104751
bleksenlen
КОРОЧЕ ОН НЕ ЗНАЕТ ЧТО ТАКОЕ itog

Он - это кто ?

bleksenlen
ВОПРОС ЧТО МОЖЕТЕ ПРЕДЛОЖИТЬ ДЛЯ РЕШЕНИЯ МОЕЙ ПРОБЛЕМЫ????

Для начала
- прекратить кричать
- использовать вложенный запрос
31 окт 11, 14:17    [11526542]     Ответить | Цитировать Сообщить модератору
 Re: как засунуть значение вычисляемого поля в переменную  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
bleksenlen
ВОПРОС ЧТО МОЖЕТЕ ПРЕДЛОЖИТЬ ДЛЯ РЕШЕНИЯ МОЕЙ ПРОБЛЕМЫ????
Таблицу завести.
31 окт 11, 14:18    [11526549]     Ответить | Цитировать Сообщить модератору
 Re: как засунуть значение вычисляемого поля в переменную  [new]
bleksenlen
Member

Откуда:
Сообщений: 77
Glory,

)))) ОН ЭТО СКУЛЬ НО МОЖНО МНЕ ТУПОМУ КАКОЙ НИТЬ ПРИМЕР ЧТОБЫ УЖЕ ЧЕНИТЬ НАЧАТЬ ДЕЛАТЬ))))))))
31 окт 11, 14:19    [11526568]     Ответить | Цитировать Сообщить модератору
 Re: как засунуть значение вычисляемого поля в переменную  [new]
bleksenlen
Member

Откуда:
Сообщений: 77
Гавриленко Сергей Алексеевич,

ККККААААААКККККК????? ПРИМЕР пожалуйста
31 окт 11, 14:20    [11526583]     Ответить | Цитировать Сообщить модератору
 Re: как засунуть значение вычисляемого поля в переменную  [new]
Glory
Member

Откуда:
Сообщений: 104751
bleksenlen
НО МОЖНО МНЕ ТУПОМУ КАКОЙ НИТЬ ПРИМЕР ЧТОБЫ УЖЕ ЧЕНИТЬ НАЧАТЬ ДЕЛАТЬ))))))))

1. Отпустите клавишу шифт
2. Сформулируйте внятно задачу
31 окт 11, 14:20    [11526592]     Ответить | Цитировать Сообщить модератору
 Re: как засунуть значение вычисляемого поля в переменную  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Еще одно сообщение капсом, и отправитесь в бан.
31 окт 11, 14:21    [11526597]     Ответить | Цитировать Сообщить модератору
 Re: как засунуть значение вычисляемого поля в переменную  [new]
bleksenlen
Member

Откуда:
Сообщений: 77
Glory, вот весь запрос
declare @i int set @i=0 
 SELECT 0 as id,r.sem,d.disc,d.idd,r.stzurn, d.kred, s.f,s.ids,s.nzkn, g.gruppa, g.idgrupp,z.rk1,z.rk2,  pr.oc as ocp, CASE WHEN (t.oc between 50 and 100) and (r.stzurn=1 or r.stzurn=0) THEN t.oc ELSE null END as oc,z2.rk1 as leto_rk1,z2.rk2 as leto_rk2, t2.oc as leto_oc
,CASE WHEN (r.stzurn=0) THEN (
--лето
CASE WHEN t2.oc>49 THEN round( (((((cast (z2.rk1 as float))+(cast( z2.rk2 as float)) )/2)*0.6)+(t2.oc*0.4)),0 )  ELSE 

--смотрим перезачет
(CASE WHEN pr.oc>49 THEN pr.oc ELSE round((((((cast (z.rk1 as float)) +(cast (z.rk2 as float)) )/2)*0.6)+(t.oc*0.4)),0) END )
 END
) ELSE (
----
CASE WHEN (r.stzurn=1) THEN (
--лето
CASE WHEN t2.oc>49 THEN (z2.rk1*0.6)+(t2.oc*0.4)  ELSE 

--смотрим перезачет
(CASE WHEN pr.oc>49 THEN pr.oc ELSE (z.rk1*0.6)+(t.oc*0.4) END )
 END
) ELSE (CASE WHEN (z2.rk1>49) THEN z2.rk1 ELSE z.rk1 END ) END


----
) END as itog



into #temp  
FROM  zurn as z
 left outer join student as s on s.ids=z.ids
 left outer join gruppa as g on g.idgrupp=s.idgrupp
 left outer join regzurn as r on r.idrz=z.idrz
 left outer join disc as d on r.idd=d.idd 
 left outer join tests2 as t on t.idd=r.idd and t.ids=s.ids and (t.sem=r.sem) 
 left outer join spec as sp on g.idspec=sp.idspec
 left outer join perezachet as pr on S.ids=pr.ids and r.idd=pr.idd
 and pr.stper=r.stzurn and (r.sem=pr.sem) and pr.oc is not null
 left outer join tests2 as t2 on (t2.idd=r.idd) and (t2.sem=3)and t2.ids=s.ids
--дублирование таблиц для вывода оценок летнего семестра
left outer join regzurn as r2 on (r2.idd=r.idd) and (r2.sem=3)and(r2.stzurn=r.stzurn)
left outer join zurn as z2 on   r2.idrz=z2.idrz and z2.ids=s.ids
 where (disc is not null)
 and (z.stotobr=0 or z.stotobr is null)
 and (s.nzkn=103020) and (d.idd<>1200101) and (t.sem<>3) and (r.sem<>3) and (r.stzurn<>4) 
 group by r.sem,d.disc,d.idd,r.stzurn, d.kred, s.f,s.ids,s.nzkn, g.gruppa, g.idgrupp,z.rk1,z.rk2,pr.oc,CASE WHEN (t.oc between 50 and 100) and (r.stzurn=1 or r.stzurn=0) THEN t.oc ELSE null END,z2.rk1,z2.rk2,t2.oc
 ,CASE WHEN (r.stzurn=0) THEN (
--лето
CASE WHEN t2.oc>49 THEN round( (((((cast (z2.rk1 as float))+(cast( z2.rk2 as float)) )/2)*0.6)+(t2.oc*0.4)),0 )  ELSE 

--смотрим перезачет
(CASE WHEN pr.oc>49 THEN pr.oc ELSE round((((((cast (z.rk1 as float)) +(cast (z.rk2 as float)) )/2)*0.6)+(t.oc*0.4)),0) END )
 END
) ELSE (
----
CASE WHEN (r.stzurn=1) THEN (
--лето
CASE WHEN t2.oc>49 THEN (z2.rk1*0.6)+(t2.oc*0.4)  ELSE 

--смотрим перезачет
(CASE WHEN pr.oc>49 THEN pr.oc ELSE (z.rk1*0.6)+(t.oc*0.4) END )
 END
) ELSE (CASE WHEN (z2.rk1>49) THEN z2.rk1 ELSE z.rk1 END ) END


----
) END
order by r.sem,d.disc,d.idd,r.stzurn, d.kred, s.f,s.ids,s.nzkn, g.gruppa, g.idgrupp,z.rk1,z.rk2,pr.oc,CASE WHEN (t.oc between 50 and 100) and (r.stzurn=1 or r.stzurn=0) THEN t.oc ELSE null END,z2.rk1,z2.rk2,t2.oc
 ,CASE WHEN (r.stzurn=0) THEN (
--лето
CASE WHEN t2.oc>49 THEN round( (((((cast (z2.rk1 as float))+(cast( z2.rk2 as float)) )/2)*0.6)+(t2.oc*0.4)),0 )  ELSE 

--смотрим перезачет
(CASE WHEN pr.oc>49 THEN pr.oc ELSE round((((((cast (z.rk1 as float)) +(cast (z.rk2 as float)) )/2)*0.6)+(t.oc*0.4)),0) END )
 END
) ELSE (
----
CASE WHEN (r.stzurn=1) THEN (
--лето
CASE WHEN t2.oc>49 THEN (z2.rk1*0.6)+(t2.oc*0.4)  ELSE 

--смотрим перезачет
(CASE WHEN pr.oc>49 THEN pr.oc ELSE (z.rk1*0.6)+(t.oc*0.4) END )
 END
) ELSE (CASE WHEN (z2.rk1>49) THEN z2.rk1 ELSE z.rk1 END ) END


----
) END
update #temp set @i=id=@i+1 
 select * from #temp  
 drop table #temp
по полю itog надо расчитать
CASE WHEN itog between 0 and 49 THEN 0 ELSE (
CASE WHEN itog between 50 and 54 THEN 1.0 ELSE (
CASE WHEN itog between 55 and 59 THEN 1.33 ELSE (
CASE WHEN itog between 60 and 64 THEN 1.67 ELSE (
CASE WHEN itog between 65 and 69 THEN 2.0 ELSE (
CASE WHEN itog between 70 and 74 THEN 2.33 ELSE (
CASE WHEN itog between 75 and 79 THEN 2.67 ELSE (
CASE WHEN itog between 80 and 84 THEN 3.0 ELSE (
CASE WHEN itog between 85 and 89 THEN 3.33 ELSE (
CASE WHEN itog between 90 and 94 THEN 3.67 ELSE 4 END
) END
) END
) END
) END
) END
) END
) END
) END
) END AS cifra
Но если предыдущий код засунуть в самый первый то выходит ошибка Что такое itog Как избавится от этой ошибки?
результат выполнения запроса:
1	1	Английский язык	0103706	0	6 	Мусаева Индира Валерьевна	303101008	103020	БЭ-11(с)	206	82	80	NULL	65	NULL	NULL	NULL	75

31 окт 11, 14:26    [11526665]     Ответить | Цитировать Сообщить модератору
 Re: как засунуть значение вычисляемого поля в переменную  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Непонятно, зачем используются вложенные CASE.
31 окт 11, 14:27    [11526676]     Ответить | Цитировать Сообщить модератору
 Re: как засунуть значение вычисляемого поля в переменную  [new]
bleksenlen
Member

Откуда:
Сообщений: 77
Jovanny, я по другоме не умею (((((((((( что можно сделать чтобы уменьшить запрос я так пишу по тому что очень много условий используется на расчет итоговой оценки и все их я проверяю таким образом.
31 окт 11, 14:30    [11526703]     Ответить | Цитировать Сообщить модератору
 Re: как засунуть значение вычисляемого поля в переменную  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
bleksenlen,

CASE
WHEN itog between 0 and 49 THEN 0
WHEN itog between 50 and 54 THEN 1.0
WHEN itog between 55 and 59 THEN 1.33
WHEN itog between 60 and 64 THEN 1.67
WHEN itog between 65 and 69 THEN 2.0
WHEN itog between 70 and 74 THEN 2.33
WHEN itog between 75 and 79 THEN 2.67
WHEN itog between 80 and 84 THEN 3.0
WHEN itog between 85 and 89 THEN 3.33
WHEN itog between 90 and 94 THEN 3.67 ELSE 4 END AS cifra
31 окт 11, 14:32    [11526715]     Ответить | Цитировать Сообщить модератору
 Re: как засунуть значение вычисляемого поля в переменную  [new]
bleksenlen
Member

Откуда:
Сообщений: 77
Jovanny,
А понятно Case можно не писать.
Вот такая теперь ошибка Invalid column name 'itog'.
31 окт 11, 14:34    [11526743]     Ответить | Цитировать Сообщить модератору
 Re: как засунуть значение вычисляемого поля в переменную  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
select 
    *
    , CASE WHEN itog between 0 and 49 THEN 0 ELSE (
    CASE WHEN itog between 50 and 54 THEN 1.0 ELSE (
    CASE WHEN itog between 55 and 59 THEN 1.33 ELSE (
    CASE WHEN itog between 60 and 64 THEN 1.67 ELSE (
    CASE WHEN itog between 65 and 69 THEN 2.0 ELSE (
    CASE WHEN itog between 70 and 74 THEN 2.33 ELSE (
    CASE WHEN itog between 75 and 79 THEN 2.67 ELSE (
    CASE WHEN itog between 80 and 84 THEN 3.0 ELSE (
    CASE WHEN itog between 85 and 89 THEN 3.33 ELSE (
    CASE WHEN itog between 90 and 94 THEN 3.67 ELSE 4 END
    ) END
    ) END
    ) END
    ) END
    ) END
    ) END
    ) END
    ) END
    ) END AS cifra
from (
     SELECT 0 as id,r.sem,d.disc,d.idd,r.stzurn, d.kred, s.f,s.ids,s.nzkn, g.gruppa, g.idgrupp,z.rk1,z.rk2,  pr.oc as ocp, CASE WHEN (t.oc between 50 and 100) and (r.stzurn=1 or r.stzurn=0) THEN t.oc ELSE null END as oc,z2.rk1 as leto_rk1,z2.rk2 as leto_rk2, t2.oc as leto_oc
    ,CASE WHEN (r.stzurn=0) THEN (
    --лето
    CASE WHEN t2.oc>49 THEN round( (((((cast (z2.rk1 as float))+(cast( z2.rk2 as float)) )/2)*0.6)+(t2.oc*0.4)),0 )  ELSE 

    --смотрим перезачет
    (CASE WHEN pr.oc>49 THEN pr.oc ELSE round((((((cast (z.rk1 as float)) +(cast (z.rk2 as float)) )/2)*0.6)+(t.oc*0.4)),0) END )
     END
    ) ELSE (
    ----
    CASE WHEN (r.stzurn=1) THEN (
    --лето
    CASE WHEN t2.oc>49 THEN (z2.rk1*0.6)+(t2.oc*0.4)  ELSE 

    --смотрим перезачет
    (CASE WHEN pr.oc>49 THEN pr.oc ELSE (z.rk1*0.6)+(t.oc*0.4) END )
     END
    ) ELSE (CASE WHEN (z2.rk1>49) THEN z2.rk1 ELSE z.rk1 END ) END


    ----
    ) END as itog



    into #temp  
    FROM  zurn as z
     left outer join student as s on s.ids=z.ids
     left outer join gruppa as g on g.idgrupp=s.idgrupp
     left outer join regzurn as r on r.idrz=z.idrz
     left outer join disc as d on r.idd=d.idd 
     left outer join tests2 as t on t.idd=r.idd and t.ids=s.ids and (t.sem=r.sem) 
     left outer join spec as sp on g.idspec=sp.idspec
     left outer join perezachet as pr on S.ids=pr.ids and r.idd=pr.idd
     and pr.stper=r.stzurn and (r.sem=pr.sem) and pr.oc is not null
     left outer join tests2 as t2 on (t2.idd=r.idd) and (t2.sem=3)and t2.ids=s.ids
    --дублирование таблиц для вывода оценок летнего семестра
    left outer join regzurn as r2 on (r2.idd=r.idd) and (r2.sem=3)and(r2.stzurn=r.stzurn)
    left outer join zurn as z2 on   r2.idrz=z2.idrz and z2.ids=s.ids
     where (disc is not null)
     and (z.stotobr=0 or z.stotobr is null)
     and (s.nzkn=103020) and (d.idd<>1200101) and (t.sem<>3) and (r.sem<>3) and (r.stzurn<>4) 
     group by r.sem,d.disc,d.idd,r.stzurn, d.kred, s.f,s.ids,s.nzkn, g.gruppa, g.idgrupp,z.rk1,z.rk2,pr.oc,CASE WHEN (t.oc between 50 and 100) and (r.stzurn=1 or r.stzurn=0) THEN t.oc ELSE null END,z2.rk1,z2.rk2,t2.oc
     ,CASE WHEN (r.stzurn=0) THEN (
    --лето
    CASE WHEN t2.oc>49 THEN round( (((((cast (z2.rk1 as float))+(cast( z2.rk2 as float)) )/2)*0.6)+(t2.oc*0.4)),0 )  ELSE 

    --смотрим перезачет
    (CASE WHEN pr.oc>49 THEN pr.oc ELSE round((((((cast (z.rk1 as float)) +(cast (z.rk2 as float)) )/2)*0.6)+(t.oc*0.4)),0) END )
     END
    ) ELSE (
    ----
    CASE WHEN (r.stzurn=1) THEN (
    --лето
    CASE WHEN t2.oc>49 THEN (z2.rk1*0.6)+(t2.oc*0.4)  ELSE 

    --смотрим перезачет
    (CASE WHEN pr.oc>49 THEN pr.oc ELSE (z.rk1*0.6)+(t.oc*0.4) END )
     END
    ) ELSE (CASE WHEN (z2.rk1>49) THEN z2.rk1 ELSE z.rk1 END ) END


    ----
    ) END
    order by r.sem,d.disc,d.idd,r.stzurn, d.kred, s.f,s.ids,s.nzkn, g.gruppa, g.idgrupp,z.rk1,z.rk2,pr.oc,CASE WHEN (t.oc between 50 and 100) and (r.stzurn=1 or r.stzurn=0) THEN t.oc ELSE null END,z2.rk1,z2.rk2,t2.oc
     ,CASE WHEN (r.stzurn=0) THEN (
    --лето
    CASE WHEN t2.oc>49 THEN round( (((((cast (z2.rk1 as float))+(cast( z2.rk2 as float)) )/2)*0.6)+(t2.oc*0.4)),0 )  ELSE 

    --смотрим перезачет
    (CASE WHEN pr.oc>49 THEN pr.oc ELSE round((((((cast (z.rk1 as float)) +(cast (z.rk2 as float)) )/2)*0.6)+(t.oc*0.4)),0) END )
     END
    ) ELSE (
    ----
    CASE WHEN (r.stzurn=1) THEN (
    --лето
    CASE WHEN t2.oc>49 THEN (z2.rk1*0.6)+(t2.oc*0.4)  ELSE 

    --смотрим перезачет
    (CASE WHEN pr.oc>49 THEN pr.oc ELSE (z.rk1*0.6)+(t.oc*0.4) END )
     END
    ) ELSE (CASE WHEN (z2.rk1>49) THEN z2.rk1 ELSE z.rk1 END ) END


    ----
    ) END
) a
31 окт 11, 14:35    [11526749]     Ответить | Цитировать Сообщить модератору
 Re: как засунуть значение вычисляемого поля в переменную  [new]
bleksenlen
Member

Откуда:
Сообщений: 77
Гавриленко Сергей Алексеевич,
дает такую ошибку The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.
Но если ORDER BY убрать то работает, но сортировки нет а нодо с сортировкой
31 окт 11, 14:40    [11526814]     Ответить | Цитировать Сообщить модератору
 Re: как засунуть значение вычисляемого поля в переменную  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
bleksenlen
Гавриленко Сергей Алексеевич,
дает такую ошибку The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.
Но если ORDER BY убрать то работает, но сортировки нет а нодо с сортировкой
Ну так перенесите ее из derived table в конец запроса.
31 окт 11, 14:44    [11526849]     Ответить | Цитировать Сообщить модератору
 Re: как засунуть значение вычисляемого поля в переменную  [new]
bleksenlen
Member

Откуда:
Сообщений: 77
Гавриленко Сергей Алексеевич,

The multi-part identifier "r.sem" could not be bound.
Сообщение 4104, уровень 16, состояние 1, строка 2
The multi-part identifier "d.disc" could not be bound.
Сообщение 4104, уровень 16, состояние 1, строка 2
The multi-part identifier "d.idd" could not be bound.
Сообщение 4104, уровень 16, состояние 1, строка 2
The multi-part identifier "r.stzurn" could not be bound.
Сообщение 4104, уровень 16, состояние 1, строка 2
и на все поля в Селекте ругается
31 окт 11, 14:47    [11526868]     Ответить | Цитировать Сообщить модератору
 Re: как засунуть значение вычисляемого поля в переменную  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
bleksenlen
Гавриленко Сергей Алексеевич,

The multi-part identifier "r.sem" could not be bound.
Сообщение 4104, уровень 16, состояние 1, строка 2
The multi-part identifier "d.disc" could not be bound.
Сообщение 4104, уровень 16, состояние 1, строка 2
The multi-part identifier "d.idd" could not be bound.
Сообщение 4104, уровень 16, состояние 1, строка 2
The multi-part identifier "r.stzurn" could not be bound.
Сообщение 4104, уровень 16, состояние 1, строка 2
и на все поля в Селекте ругается
Так не "r" или "d" надо, а "a".
31 окт 11, 14:49    [11526879]     Ответить | Цитировать Сообщить модератору
 Re: как засунуть значение вычисляемого поля в переменную  [new]
bleksenlen
Member

Откуда:
Сообщений: 77
Гавриленко Сергей Алексеевич,
Спасибо люби добрые получилось но это еще не все необходимо сейчас это cifra умножить на количество кредитов поле r.kred Как это сделать?
31 окт 11, 14:55    [11526922]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить