Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Ошибка при использовании оператора CASE  [new]
komil
Member

Откуда: 2shanbe
Сообщений: 134
Здравствуйте.

Возникла проблема с использованием оператора CASE, вроде все по логике но че то выдает ошибочку, хотелось бы услышать мнение профессионалов, собственно и творение:


use Payvand 
SELECT CONVERT(char(10), payments.DateCreated, 103) + ' ' + CONVERT(char(10), payments.DateCreated, 108) as DateCreated, 
payment_types.pname, agents.LName, agents.FName, payments.Account, payments.PaymentNet, a.LName as toLName, 
a.FName as toFName, payments.PaymentNet, payments.PType, payments.Balance, users.FName as UserFName, 
users.LName as UserLName,
CASE WHEN payments.PType = 1 THEN 
(select shortname from services where services.SrvId = payments.SrvId) 
ELSE 
(select agents.LName, agents.FName from receipts
inner join agents on agents.AgentId=receipts.SourceId
inner join payments on payments.TranId=receipts.ReceiptTranId) 
END AS ServiceName 
FROM payments 
INNER JOIN agents ON payments.AgentId=agents.AgentId 
INNER JOIN agents a ON payments.AgentId=a.AgentId 
INNER JOIN users ON users.UserId=payments.UserId 
INNER JOIN payment_types ON payment_types.ptype=payments.ptype 
WHERE 
payments.PaymentState <> 0 
AND payments.PaymentState <> 2 
AND payments.DateCreated 
BETWEEN CAST('2011-09-14 00:00:00.000' AS DATETIME) AND CAST('2011-09-14 23:59:59.999' AS DATETIME) 
AND payments.AgentId=550051 ORDER BY payments.DateUpdated
27 сен 11, 15:09    [11342390]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Ща, только текст ошибки угадаем за пару страниц.
27 сен 11, 15:10    [11342400]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
komil
Member

Откуда: 2shanbe
Сообщений: 134
Как тут править текст?
27 сен 11, 15:11    [11342420]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31969
komil
но че то выдает ошибочку
Какую?
27 сен 11, 15:12    [11342425]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31969
komil
Как тут править текст?
Написано пером... Рукописи не сгорают... :-)
27 сен 11, 15:12    [11342432]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
komil
Member

Откуда: 2shanbe
Сообщений: 134
alexeyvg,

:) ну и бог с ним, в общем ошибка такая


Msg 116, Level 16, State 1, Line 12
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
27 сен 11, 15:14    [11342446]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
komil
alexeyvg,

:) ну и бог с ним, в общем ошибка такая


Msg 116, Level 16, State 1, Line 12
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
Ну правильно. Как сервер в одно поле должен впихнуть ваши
select agents.LName, agents.FName from receipts
?
27 сен 11, 15:15    [11342461]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Небось SELECT в CASE возвращает больше одной записи.
Или CAST не может преобразовать строку в 14-й месяц.
27 сен 11, 15:15    [11342464]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
komil,

а вы в курсе что вот это CAST('2011-09-14 23:59:59.999' AS DATETIME) равно вот этому '20110915' ??
27 сен 11, 15:17    [11342480]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Скока строк возвращает:
select shortname from services where services.SrvId = payments.SrvId
?
27 сен 11, 15:17    [11342481]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
komil
Member

Откуда: 2shanbe
Сообщений: 134
iap,

14-день, с датой все нормально ошибок нет, вероятно ошибка где то после ELSE
27 сен 11, 15:17    [11342483]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
WarAnt
komil,

а вы в курсе что вот это CAST('2011-09-14 23:59:59.999' AS DATETIME) равно вот этому '20110915' ??


и то если конверт пройдет правильно:)
27 сен 11, 15:18    [11342491]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
komil
Member

Откуда: 2shanbe
Сообщений: 134
WarAnt
komil,

а вы в курсе что вот это CAST('2011-09-14 23:59:59.999' AS DATETIME) равно вот этому '20110915' ??


честно не в курсе, укажите на правильный вариант буду рад
27 сен 11, 15:18    [11342496]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
komil, 11342461
27 сен 11, 15:20    [11342512]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
komil
iap,

14-день, с датой все нормально ошибок нет, вероятно ошибка где то после ELSE


ошибка в том что вы пытаетесь впихнуть кучу строк в одно значение выводимое в конкретном поле колонки ServiceName
27 сен 11, 15:20    [11342517]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
komil
WarAnt
komil,

а вы в курсе что вот это CAST('2011-09-14 23:59:59.999' AS DATETIME) равно вот этому '20110915' ??


честно не в курсе, укажите на правильный вариант буду рад


payments.DateCreated
BETWEEN CAST('20110914 00:00:00.000' AS DATETIME) AND CAST('20110914 23:59:59.997' AS DATETIME)

либо

payments.DateCreated >='20110914' AND payments.DateCreated < '20110915'
27 сен 11, 15:23    [11342533]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
komil
iap,

14-день, с датой все нормально ошибок нет, вероятно ошибка где то после ELSE
Выполните
SET LANGUAGE русский;
или
SET DATEFORMAT ydm;
и запустите свой подправленный запрос ещё раз.
Считаете, что ерунда всё это? Но ведь язык задаётся для сессии.
И кто-то всегда может воспользоваться Вашим запросом именно в таких условиях.
27 сен 11, 15:30    [11342596]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
iap,

Сколько записей возвращает?
select agents.LName, agents.FName from receipts
inner join agents on agents.AgentId=receipts.SourceId
inner join payments on payments.TranId=receipts.ReceiptTranId

Ещё совет, временно упростите запрос. К примеру, выкинте фрагмент до CASE

SELECT CONVERT(char(10), payments.DateCreated, 103) + ' ' + CONVERT(char(10), payments.DateCreated, 108) as DateCreated, 
payment_types.pname, agents.LName, agents.FName, payments.Account, payments.PaymentNet, a.LName as toLName, 
a.FName as toFName, payments.PaymentNet, payments.PType, payments.Balance, users.FName as UserFName, 
users.LName as UserLName,

легче будет ошибку искать
27 сен 11, 15:45    [11342745]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
trew,

мои вопросы к komil (а не к iap,)
27 сен 11, 15:46    [11342765]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
select agents.LName, agents.FName from receipts

Должно возвращать ОДНО ПОЛЕ !!!! А не два.

Only one expression can be specified !!!
27 сен 11, 15:57    [11342860]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
komil
Member

Откуда: 2shanbe
Сообщений: 134
trew,

Понял намек по поводу запроса:

select agents.LName from receipts
inner join agents on agents.AgentId=receipts.SourceId
inner join payments on payments.TranId=receipts.ReceiptTranId

попробовал вытащить только agents.LName, но таже проблема.

попробовал упростить запрос до такого уровня:


SELECT CONVERT(char(10), payments.DateCreated, 103) + ' ' + CONVERT(char(10), payments.DateCreated, 108) as DateCreated, 
payment_types.pname, agents.LName, agents.FName, payments.Account, payments.PaymentNet, a.LName as toLName, 
a.FName as toFName, payments.PaymentNet, payments.PType, payments.Balance, users.FName as UserFName, 
users.LName as UserLName,
CASE WHEN payments.PType = 1 THEN 
(select shortname from services where services.SrvId = payments.SrvId) 
ELSE 
(select shortname from services where services.SrvId = payments.SrvId) 
END AS ServiceName 
FROM payments 
INNER JOIN agents ON payments.AgentId=agents.AgentId 
INNER JOIN agents a ON payments.AgentId=a.AgentId 
INNER JOIN users ON users.UserId=payments.UserId 
INNER JOIN payment_types ON payment_types.ptype=payments.ptype 
WHERE 
payments.PaymentState <> 0 
AND payments.PaymentState <> 2 
AND payments.DateCreated 
BETWEEN CAST('2011-09-14 00:00:00.000' AS DATETIME) AND CAST('2011-09-14 23:59:59.999' AS DATETIME) 
AND payments.AgentId=550051 ORDER BY payments.DateUpdated

после ELSE поставил тот же запрос который был до него и все отработало идеально, вероятно ошибка во втором подзапросе после ELSE
27 сен 11, 15:59    [11342887]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
komil,

select agents.LName from receipts
inner join agents on agents.AgentId=receipts.SourceId
inner join payments on payments.TranId=receipts.ReceiptTranId
скока строк вернет?
27 сен 11, 16:02    [11342919]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
komil
Member

Откуда: 2shanbe
Сообщений: 134
kDnZP
komil,

select agents.LName from receipts
inner join agents on agents.AgentId=receipts.SourceId
inner join payments on payments.TranId=receipts.ReceiptTranId
скока строк вернет?


45-строк, че то не понял ход твоих мыслей
27 сен 11, 16:12    [11343028]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
komil
kDnZP
komil,

select agents.LName from receipts
inner join agents on agents.AgentId=receipts.SourceId
inner join payments on payments.TranId=receipts.ReceiptTranId
скока строк вернет?


45-строк, че то не понял ход твоих мыслей
11342464
27 сен 11, 16:14    [11343050]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании оператора CASE  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
komil,

top 1 после SELECT вас спасет судя по всему:) поставьте и наслаждайтесь, а может и озарение придет к тому же:)
27 сен 11, 16:17    [11343079]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить