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

Откуда: г. Калуга
Сообщений: 1198
Почему такой запрос неправильный?
"В статистическом выражении, содержащем внешнюю ссылку, указано более одного столбца. Если статистическое выражение содержит внешнюю ссылку, то эта внешняя ссылка должна являться единственным столбцом, на который в выражении есть ссылка."
select CST.*, 
       (select sum(Case 
                   when GC.Count > CST.Count then 0
                   else GC.Count 
                   end 
                  ) as Count
        from GivenCoupons GC
        where GC.CouponCode = Cst.CouponCode  
) as Remainder
from CouponsStore CST


В тоже время, если вместо CST.Count поставить константу, то нормально все
24 янв 14, 09:29    [15460849]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
minva
Почему такой запрос неправильный?
Написано в первом предложении сообщения об ошибке.
select CST.*, 
       (select sum(GC.Count) as Count
        from GivenCoupons GC
        where GC.CouponCode = Cst.CouponCode and GC.Count <= CST.Count
) as Remainder
from CouponsStore CST
24 янв 14, 09:42    [15460901]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
minva,

Ну так, в ошибке написано, что так делать нельзя.

Можно заменить так:
select CST.*, 
       (select sum(GC.Count) as Count
        from @GivenCoupons GC
        where GC.CouponCode = Cst.CouponCode and  GC.Count <= CST.Count
) as Remainder
from @CouponsStore CST
24 янв 14, 09:43    [15460905]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
Ruuu,
Я сильно упростил запрос. Поэтому переписать его так, как у Вас не прокатит. Вопрос был ПОЧЕМУ?
два варианта ответа
1. Одному MS это ведомо. Точка. Так сделали, значит так надо
2. Есть какое-то логическое объяснение, я пока не вижу причин, почему во where можно подставить значение столбца из внешнего запроса. а в when нельзя
24 янв 14, 10:10    [15461039]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
Glory
Member

Откуда:
Сообщений: 104760
minva
1. Одному MS это ведомо. Точка. Так сделали, значит так надо

Сообщение об ошибке непонятно что ли ?

minva
2. Есть какое-то логическое объяснение, я пока не вижу причин, почему во where можно подставить значение столбца из внешнего запроса. а в when нельзя

Вы точно читали сообщение ? Там говорится про количество ссылок
24 янв 14, 10:16    [15461070]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
Glory, читал, переведите с русского на русский
Что в данном случае статистическое выражение? Есть статистическая функция SUM. А выражение - это весь запрос?
Но даже же дело не в этом. Еще раз вопрос бы ПОЧЕМУ, а мне отвечают, потому что так написано. Я и сам вижу что написано, мне интресней в данном случае откуда ноги растут у этого ограничения.
24 янв 14, 10:33    [15461193]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
Glory
Member

Откуда:
Сообщений: 104760
minva
Что в данном случае статистическое выражение? Есть статистическая функция SUM. А выражение - это весь запрос?

Статичтическое выражение - это то, что является аргументом статистической функции.

minva
Я и сам вижу что написано, мне интресней в данном случае откуда ноги растут у этого ограничения.

Ноги растут из вашего незнания ограничений продукта. Вы все время пытаетесь придумать свой TSQL.
24 янв 14, 10:37    [15461210]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
minva
Я и сам вижу что написано, мне интресней в данном случае откуда ноги растут у этого ограничения.

Ноги растут из вашего незнания ограничений продукта. [/quot]

Спасибо КЭП. Я и сам это знаю
24 янв 14, 10:41    [15461227]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
minva
Что в данном случае статистическое выражение? Есть статистическая функция SUM. А выражение - это весь запрос?
Статистическое выражение - это текст, который указывается внутри скобок при вызове статистической функции.
minva
Я и сам вижу что написано, мне интресней в данном случае откуда ноги растут у этого ограничения.
В принципе случае это ненужное ограничение, потому что логически для подзапроса все внешние ссылки являются константами. Может, как то исторически сложилось...
24 янв 14, 10:43    [15461238]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
>Статичтическое выражение - это то, что является аргументом статистической функции.

> Если статистическое выражение содержит внешнюю ссылку, то эта внешняя ссылка должна являться единственным столбцом, на который в выражении есть ссылка.

Где тогда в моем выражении вторя ссылка? Я вижу только одну - CST.Count
24 янв 14, 10:43    [15461240]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
Glory
Member

Откуда:
Сообщений: 104760
minva
Где тогда в моем выражении вторя ссылка? Я вижу только одну - CST.Count

Вы еще и считать не умеете
24 янв 14, 10:45    [15461252]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
minva
> Если статистическое выражение содержит внешнюю ссылку, то эта внешняя ссылка должна являться единственным столбцом, на который в выражении есть ссылка.

Где тогда в моем выражении вторя ссылка? Я вижу только одну - CST.Count
Вторая ссылка - это ссылка на GC.Count

"статистическое выражение содержит внешнюю ссылку, то эта внешняя ссылка должна являться единственным столбцом" - то есть больше ничего, никаких ссылок, внешних или внутренних, кроме CST.Count, быть не должно.
24 янв 14, 10:54    [15461306]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
Glory
minva
Где тогда в моем выражении вторя ссылка? Я вижу только одну - CST.Count

Вы еще и считать не умеете


Хорошо, не умею... Эксперименты:

  select CST.*, 
       (select sum(Case 
                   when GC.Count> 5 then 0
                   else GC.Count
                   end 
                  ) as qqq
        from GivenCoupons GC
        where GC.CouponCode = Cst.CouponCode and GC.SeriesID = CSt.SeriesID      
) as Remainder
from CouponsStore CST 

РАБОТАЕТ!!!!

  select CST.*, 
       (select sum(Case 
                   when CST.Count> 5 then 0
                   else Cst.Count
                   end 
                  ) as qqq
        from GivenCoupons GC
        where GC.CouponCode = Cst.CouponCode and GC.SeriesID = CSt.SeriesID      
) as Remainder
from CouponsStore CST 


Столбец "CouponsStore.ID" недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.

Тут то где логика???
24 янв 14, 11:01    [15461338]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
Glory
Member

Откуда:
Сообщений: 104760
minva
Тут то где логика???

У вас нету логики. Это точно.
24 янв 14, 11:02    [15461345]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
Glory, у меня конкретные вопросы, у Вас общие фразы. В последнем примере с точки зрения пользы запросов логики никакой, с точки зрения синтаксиса то что не так?
24 янв 14, 11:04    [15461357]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
Glory
Member

Откуда:
Сообщений: 104760
minva
Glory, у меня конкретные вопросы,

У вас ???
У вас вера в непогрешимость своего кода

minva
с точки зрения синтаксиса то что не так?

Может у вас со зрением плохо ?
Так лучше видно ?
Столбец "CouponsStore.ID" недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.
24 янв 14, 11:06    [15461364]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
Glory, чем отличается верхний запрос от нижнего? ЧЕМ? Чего такого там неправильно с точки зрения синтаксиса, что вылезает такая ошибка?
24 янв 14, 11:13    [15461385]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
minva
Столбец "CouponsStore.ID" недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.

Тут то где логика???

Так нагляднее в чем у вас ошибка.
select CST.*,SUM(cst.count)
from @CouponsStore CST 

ЗЫ: вы бы лучше привели полный запрос со скриптами таблиц и написали, что вам нужно. Мы бы вам помогли.
24 янв 14, 11:14    [15461395]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
Glory
Member

Откуда:
Сообщений: 104760
minva
Glory, чем отличается верхний запрос от нижнего? ЧЕМ?

Ничем.
Вы запостили два абсолютно одинаковых запроса.
И поэтому непонятно, как один и тот же запрос у вас может и работать и не работать одновременно
24 янв 14, 11:15    [15461404]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Ruuu
Так нагляднее в чем у вас ошибка.
select CST.*,SUM(cst.count)
from @CouponsStore CST 
Ну вообще логика этих запросов отличается:
select CST.id,SUM(cst.count) from table
select CST.id,(select SUM(cst.count) from othertable) from table
Для второго запроса:
Для каждой записи в таблице table выполняем поздапрос (select SUM(cst.count) from othertable), в котором значение cst.count константа и является значением cst.count для текущей строки table, для которой выполняется этот подзапрос.
24 янв 14, 11:30    [15461520]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
alexeyvg
Ну вообще логика этих запросов отличается:
select CST.id,SUM(cst.count) from table
select CST.id,(select SUM(cst.count) from othertable) from table

Для второго запроса:
Для каждой записи в таблице table выполняем поздапрос (select SUM(cst.count) from othertable), в котором значение cst.count константа и является значением cst.count для текущей строки table, для которой выполняется этот подзапрос.
В примере у ТС так:
select CST.id,(select SUM(cst.count) from othertable ot) from table cst
Т.е. значение берется не из подзапроса, а из внешнего запроса. Поэтому и возникает ошибка:
Column 'CouponsStore.count' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
24 янв 14, 11:43    [15461619]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
Glory
minva
Glory, чем отличается верхний запрос от нижнего? ЧЕМ?

Ничем.
Вы запостили два абсолютно одинаковых запроса.
И поэтому непонятно, как один и тот же запрос у вас может и работать и не работать одновременно


Удивитесь, они разные

2Ruuu: В упрощенном варианте как раз все понятно.
Давайте на пальцах по частям

Упростим максимально запрос.

select CST.*, 
       (select sum(GC.Count) as Count
        from GivenCoupons GC) as Remainder
from CouponsStore CST

1. Подзапрос возвращает для КАЖДОЙ строки внешнего запроса некое значение полученное из внутреннего запроса. Это верно?
2.В нашем случае это сумма и зависит от количества строк, возвращаемых подзапросом. Если суммируется значение столбца GC.Count - то эта сумма будет такой GC.Count_1 + GC.Count_2 + ... + GC.Count_N, где N количество записей возвращенных подзапросом. Это верно?
2. Если утверждение "потому что логически для подзапроса все внешние ссылки являются константами" правильное, то
если мы в Sum подставим CST.Count, то сумма будет такой CST.Count_X * N, где CST.Count_X - это значение из ТЕКУЩЕЙ строки внешнего запроса. Это верно?

Где косяк в моих рассуждениях?
24 янв 14, 11:45    [15461640]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
>Т.е. значение берется не из подзапроса, а из внешнего запроса. Поэтому и возникает ошибка:

т.е. как бы сказать внешний запрос имеет приоритет на использование sum? Извиняюсь за корявость определений
24 янв 14, 11:48    [15461669]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
Glory
Member

Откуда:
Сообщений: 104760
minva
если мы в Sum подставим CST.Count, то сумма будет такой CST.Count_X * N, где CST.Count_X - это значение из ТЕКУЩЕЙ строки внешнего запроса. Это верно?

(select sum(CST.Count) as Count from GivenCoupons GC)
Как вы себе представляете суммирование поля одной таблицы при сканировании другой таблицы ?
По какому принципу записи из GC должны связываться с CST ?

minva
Удивитесь, они разные

Да, ошибся
24 янв 14, 11:49    [15461681]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с Case  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
[quot Glory]
minva
если мы в Sum подставим CST.Count, то сумма будет такой CST.Count_X * N, где CST.Count_X - это значение из ТЕКУЩЕЙ строки внешнего запроса. Это верно?

(select sum(CST.Count) as Count from GivenCoupons GC)
Как вы себе представляете суммирование поля одной таблицы при сканировании другой таблицы ?
По какому принципу записи из GC должны связываться с CST ?

там выше была фраза: если утверждение "потому что логически для подзапроса все внешние ссылки являются константами" правильное.
Те. я представлял себе это так -берется значение поля CST.Count из текущей строки и это число суммируется N раз.
А если sum(CST.Count) - это выражение относящееся к внешнему запросу, тогда все понятно, спасибо за терпение
24 янв 14, 11:59    [15461785]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить