Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) Ошибка ORDER BY ... a UNION operator. (число прочтений - 8752 )
ASV
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 11
Зарегистрирован: 18. Июня 2006
Пол: Мужской
Ошибка ORDER BY ... a UNION operator.
21. Июня 2006 :: 06:56
Печать  
     ТекстЗапроса =
     "SELECT    
     |      Субконто1,
     |      SUM(Сумма1) Сумма3,
     |      SUM(Сумма2) Сумма4,
     |      SUM(Колич)      Количество
     |FROM       (
     |                  SELECT    
     |                        DTSC0      Субконто1,
     |                        SUM_      Сумма1,
     |                        0            Сумма2,
     |                        AMOUNT      Колич
     |                  FROM
     |                        _1SENTRY Проводки
     |                  HAVING      
     |                        (Проводки.DATE_TIME_DOCID BETWEEN :НачДата AND :КонДата~) AND (Проводки.ACCDTID = :Счет90)
     |                  
     |                  UNION ALL
    |
     |                  SELECT    
     |                        DTSC0      Субконто1,
     |                        0            Сумма1,
     |                        SUM_      Сумма2,
     |                        AMOUNT      Колич
     |                  FROM
     |                        _1SENTRY Проводки
     |                  HAVING      
     |                        (Проводки.DATE_TIME_DOCID BETWEEN :НачДата AND :КонДата~) AND (Проводки.ACCKTID = :Счет90_1)
     |                  
     |                  ) TMP
     |GROUP BY
     |            Субконто1
     |ORDER BY
     |            Субконто1 ASC
     |";

ругается
State 42000, native 104, message [Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select list if the statement contains a UNION operator.

что не так?
  
Наверх
ICQ  
IP записан
 
S.W.A.T.
Junior Member
**
Отсутствует



Сообщений: 42
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка ORDER BY ... a UNION operator.
Ответ #1 - 21. Июня 2006 :: 06:59
Печать  
С HAVING не очепятка случайно? Вообще-то WHERE должно быть Подмигивание
  
Наверх
ICQ  
IP записан
 
ASV
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 11
Зарегистрирован: 18. Июня 2006
Пол: Мужской
Re: Ошибка ORDER BY ... a UNION operator.
Ответ #2 - 21. Июня 2006 :: 08:06
Печать  
HAVING написал мастер запросов Enterprise Manager'a
если убрать второй SELECT и UNION работает
  
Наверх
ICQ  
IP записан
 
S.W.A.T.
Junior Member
**
Отсутствует



Сообщений: 42
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка ORDER BY ... a UNION operator.
Ответ #3 - 21. Июня 2006 :: 08:28
Печать  
ASV писал(а) 21. Июня 2006 :: 08:06:
HAVING написал мастер запросов Enterprise Manager'a
если убрать второй SELECT и UNION работает

А если вместо HAVING, WHERE написать? Ошибка остается?
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Ошибка ORDER BY ... a UNION operator.
Ответ #4 - 21. Июня 2006 :: 08:43
Печать  
HAVING нужно заменить на WHERE
  

1&&2&&3
Наверх
 
IP записан
 
S.W.A.T.
Junior Member
**
Отсутствует



Сообщений: 42
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка ORDER BY ... a UNION operator.
Ответ #5 - 21. Июня 2006 :: 08:46
Печать  
trad писал(а) 21. Июня 2006 :: 08:43:
HAVING нужно заменить на WHERE

Вообще говоря:

Specifies a search condition for a group or an aggregate. HAVING is usually used with the GROUP BY clause. When GROUP BY is not used, HAVING behaves like a WHERE clause.

BOL


  
Наверх
ICQ  
IP записан
 
ASV
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 11
Зарегистрирован: 18. Июня 2006
Пол: Мужской
Re: Ошибка ORDER BY ... a UNION operator.
Ответ #6 - 21. Июня 2006 :: 08:52
Печать  
завтра проверю
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка ORDER BY ... a UNION operator.
Ответ #7 - 21. Июня 2006 :: 09:05
Печать  
Будь проще:  Улыбка
Код
Выбрать все
SELECT      
    Проводки.DTSC0 Субконто1,
    Sum(CASE WHEN Проводки.ACCDTID = :Счет90 THEN SUM_ ELSE 0 END) Сумма3,
    Sum(CASE WHEN Проводки.ACCKTID = :Счет90_1 THEN SUM_ ELSE 0 END) Сумма4,
    Sum(Проводки.AMOUNT) Количество
FROM
    _1SENTRY Проводки (nolock)
WHERE      
    (Проводки.DATE_TIME_DOCID BETWEEN :НачДата AND :КонДата~)
    AND (Проводки.ACCDTID = :Счет90 OR Проводки.ACCKTID = :Счет90_1)
GROUP BY  
    Проводки.DTSC0
ORDER BY  
    Проводки.DTSC0  

  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Ошибка ORDER BY ... a UNION operator.
Ответ #8 - 21. Июня 2006 :: 09:45
Печать  
S.W.A.T. писал(а) 21. Июня 2006 :: 08:46:
Specifies a search condition for a group or an aggregate. HAVING is usually used with the GROUP BY clause. When GROUP BY is not used, HAVING behaves like a WHERE clause.

Цитата:
Specifies a search condition for a group or an aggregate.

Отсюда второе предложение в контексте первого можно интерпретировать так: если нет группировки, то в условии можно использовать только агрегаты
  

1&&2&&3
Наверх
 
IP записан
 
S.W.A.T.
Junior Member
**
Отсутствует



Сообщений: 42
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка ORDER BY ... a UNION operator.
Ответ #9 - 21. Июня 2006 :: 09:47
Печать  
trad писал(а) 21. Июня 2006 :: 09:45:
S.W.A.T. писал(а) 21. Июня 2006 :: 08:46:
Specifies a search condition for a group or an aggregate. HAVING is usually used with the GROUP BY clause. When GROUP BY is not used, HAVING behaves like a WHERE clause.

Изменено:
Specifies a search condition for a group or an aggregate.

Отсюда второе предложение в контексте первого можно интерпретировать так: если нет группировки, то в условии можно использовать только агрегаты

Но опять же HAVING is usually used with the GROUP BY clause - обычно, не эквивалентно обязательно Подмигивание
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Ошибка ORDER BY ... a UNION operator.
Ответ #10 - 21. Июня 2006 :: 09:47
Печать  
bol тоже люди писали
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Ошибка ORDER BY ... a UNION operator.
Ответ #11 - 21. Июня 2006 :: 09:52
Печать  
"behaves like" можно перевести как "ведет себя подобно", но не "в точности как"

давай не будем заниматься игрой слов.
практика лучший способ узнать истину. я свое утверждение проверил прежде чем запостить.
а вообще berezdetsky как всегда прав
  

1&&2&&3
Наверх
 
IP записан
 
ASV
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 11
Зарегистрирован: 18. Июня 2006
Пол: Мужской
Re: Ошибка ORDER BY ... a UNION operator.
Ответ #12 - 21. Июня 2006 :: 22:06
Печать  
Вариант с WHERE ошибку не выдает, работает, но цифры не правильные выдает. Если отсавить только SELECT со Счет90, результат правильный
  
Наверх
ICQ  
IP записан
 
ASV
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 11
Зарегистрирован: 18. Июня 2006
Пол: Мужской
Re: Ошибка ORDER BY ... a UNION operator.
Ответ #13 - 21. Июня 2006 :: 22:17
Печать  
вариант berezdetsky работает, и правильно работает.
Всем спасибо
  
Наверх
ICQ  
IP записан
 
serjeant
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 5
Зарегистрирован: 12. Сентября 2008
Re: Ошибка ORDER BY ... a UNION operator.
Ответ #14 - 12. Сентября 2008 :: 11:29
Печать  
Ребята, та же проблема с :"
ORDER BY items must appear in the select list if the statement contains a UNION operator"
Текст запроса:
SELECT
  ЖР.ids as [Сотрудник $Справочник.Сотрудники],
  $ПоследнееЗначение.Сотрудники.ОсновноеНазначение(ЖР.ids,:КонДата~~) AS [Назн $Справочник.Назначения]   
FROM
  $ЖурналРасчетов.Зарплата AS ЖР
WHERE (ЖР.period>=:НачДатаГод) AND (ЖР.period<=:Пер)
and (ЖР.dateb>=:НачДата) AND (ЖР.datee<=:КонДата) AND (ЖР.ids=:Сот)
Union
SELECT   
  ЖРо.ids as [Сотрудник $Справочник.Сотрудники],
  $ПоследнееЗначение.Сотрудники.ОсновноеНазначение(ЖРо.ids,:КонДата~~) AS [Назн $Справочник.Назначения]   
FROM
  $ЖурналРасчетов.ОтчисленияВФонды AS ЖРо
WHERE (ЖРо.period>=:НачДатаГод) AND (ЖРо.period<=:Пер)
and (ЖРо.dateb>=:НачДата) AND (ЖРо.datee<=:КонДата) AND (ЖРо.ids=:Сот)

Помогите, плиз. не знаю как его правильно написать чтоб работал
  
Наверх
 
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Ошибка ORDER BY ... a UNION operator.
Ответ #15 - 12. Сентября 2008 :: 12:23
Печать  
[quote author=maximasj link=1150872965/0#14 date=1221218942]
Помогите, плиз. не знаю как его правильно написать чтоб работал
[/quote]

примерно, так:

[code]SELECT
     Код, Товар, Штрихкод, ПолнНаименование, Disc, LimDisc, РодКод, РодКод2, РодКод3, ОгрСкид, Колич, вид,
     isNULL((Select (
select top 1
cast(c3775_vv.value as numeric(14, 2))
from
_1sconst as c3775_vv (nolock)
where
c3775_vv.id = 3775 and
c3775_vv.objid = СпрЦ.ID and
(c3775_vv.date <= '20080821')
order by c3775_vv.date desc, c3775_vv.time desc, c3775_vv.docid desc, c3775_vv.row_id desc
) Цена
           FROM sc3772 СпрЦ (NOLOCK) WHERE СпрЦ.ParentExt = Товар AND
                          СпрЦ.sp3787 = '     PCEE'),0)  AS Цена
FROM

(SELECT
       Tov.code as Код,
     РегП.sp101 AS Товар,
       Tov.sp3559 as ШтрихКод,
       Tov.sp3024 as ПолнНаименование,
       Tov.sp6622 as Disc,
       Tov.sp6574 as LimDisc,
       isNULL(R1.code, '') as РодКод,
       isNULL(R2.code, '') as РодКод2,
       isNULL(R3.code, '') as РодКод3,
       isNULL(UR.ogrSk, 0) as ОгрСкид,
     РегП.sp102  AS Колич,
      0 as Вид
  FROM
     rg99 as РегП (NOLOCK)
           
     INNER JOIN sc33 Tov (NOLOCK) ON Tov.ID = РегП.sp101
     LEFT JOIN sc33 R1 (NOLOCK) ON Tov.ParentID = R1.ID
     LEFT JOIN sc33 R2 (NOLOCK) ON R1.ParentID = R2.ID
     LEFT JOIN sc33 R3 (NOLOCK) ON R2.ParentID = R3.ID
     LEFT JOIN (select u3.id, u3.sp6685 ogrSk from sc33 u3 (NOLOCK)
                  where u3.parentid IN (select u2.id from sc33 u2 (NOLOCK)
                    where u2.parentid IN (Select u1.id from sc33 u1 (NOLOCK) where parentid = '     0   '))
           ) ur ON ur.id = R3.parentid OR ur.id = R2.parentid OR ur.id = R1.parentid
           
WHERE 
               Period = '20080801' AND РегП.sp3603 = '     0   ' 
   AND РегП.sp100 = '    14CEE'
           AND РегП.sp102 >0

UNION

  SELECT
       Tov1.code,
     Tov1.ID,
       Tov1.sp3559,
       Tov1.sp3024,
       Tov1.sp6622,
       Tov1.sp6574,
       '',
       '',
       '',
       0,
     0,
       1
  FROM
    sc33 Tov1 (NOLOCK)
WHERE
ltrim(Tov1.sp689) = 'J4'
) ttt

ORDER BY Вид, Товар[/code]
т.е. делаешь обертку Униону и выносишь наружу получение последнего значения.
  
Наверх
 
IP записан
 
vivm
Full Member
***
Отсутствует



Сообщений: 159
Местоположение: Новосибирск
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Ошибка ORDER BY ... a UNION operator.
Ответ #16 - 13. Сентября 2008 :: 02:18
Печать  
2 serjeant

"This error message appears when you try to sort a resultset by an element that is not contained in the SELECT list and the statement contains a UNION-, INTERSECT-, or EXCEPT operator."

Посмотри через Отладка(1), во что у тебя запрос разворачивается и делай соответствующие выводы
  
Наверх
ICQ  
IP записан
 
serjeant
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 5
Зарегистрирован: 12. Сентября 2008
Re: Ошибка ORDER BY ... a UNION operator.
Ответ #17 - 15. Сентября 2008 :: 07:30
Печать  
Получилось через организацию выборки периодических реквизитов из таблицы _1SConst:

SELECT
  ЖР.ids as [Сотрудник $Справочник.Сотрудники],
  ЖР.FF1589 as [Фирма $Справочник.Фирмы],
  ЖР.FF189 as [Подр $Справочник.Подразделения],
  ЖР.idalg AS [ВидРасч $ВидРасчета], 
  ЖР.period AS [Период $Дата],
  ЖР.dateb AS ДатаНачала,
  ЖР.result AS Результат,
  $СпрСотр.Фирма as [Фирма ,$Справочник.фирмы],
  Назн.val as [назн $Справочник.Назначения]
FROM
  $ЖурналРасчетов.Зарплата AS ЖР
Left join $Справочник.Сотрудники as СпрСотр on СпрСотр.id=ЖР.ids
Left join  (SELECT
                 Период.objid as objid, 
                 Период.value as val
           FROM _1sconst as Период
           WHERE
                    Период.date in (SELECT 
                          MAX(Константа.date) 
                    FROM _1sconst as Константа 
                    WHERE
                            (Константа.date <= :КонДата) 
                            AND (Константа.id =                              $ИсторияРеквизита.Сотрудники.ОсновноеНазначение) 
                            AND (Константа.objid = Период.objid))
                            AND Период.id =                              $ИсторияРеквизита.Сотрудники.ОсновноеНазначение) as Назн
                    on Назн.objid = СпрСотр.id
WHERE (ЖР.period>=:НачДатаГод) AND (ЖР.period<=:Пер)
and (ЖР.dateb>=:НачДата) AND (ЖР.datee<=:КонДата) AND (ЖР.ids=:Сот)
Union
SELECT   
  ЖРо.ids as [Сотрудник $Справочник.Сотрудники],
  ЖРо.FF1589 as [Фирма $Справочник.Фирмы],
  ЖРо.FF189 as [Подр $Справочник.Подразделения],
  ЖРо.idalg AS [ВидРасч $ВидРасчета],
  ЖРо.period AS [Период $Дата],
  ЖРо.dateb AS ДатаНачала,
  ЖРо.result AS Результат,
  $СпрСотр.Фирма as [Фирма ,$Справочник.фирмы],
  Назн.val as [назн $Справочник.Назначения]   
FROM
  $ЖурналРасчетов.ОтчисленияВФонды AS ЖРо
Left join $Справочник.Сотрудники as СпрСотр on СпрСотр.id=ЖРо.ids
Left join  (SELECT
                 Период.objid as objid, 
                 Период.value as val
           FROM _1sconst as Период
           WHERE
                    Период.date in (SELECT 
                          MAX(Константа.date) 
                    FROM _1sconst as Константа 
                    WHERE
                            (Константа.date <= :КонДата) 
                            AND (Константа.id =                              $ИсторияРеквизита.Сотрудники.ОсновноеНазначение) 
                            AND (Константа.objid = Период.objid))
                            AND Период.id =                              $ИсторияРеквизита.Сотрудники.ОсновноеНазначение) as Назн
                    on Назн.objid = СпрСотр.id
WHERE (ЖРо.period>=:НачДатаГод) AND (ЖРо.period<=:Пер)
and (ЖРо.dateb>=:НачДата) AND (ЖРо.datee<=:КонДата) AND (ЖРо.ids=:Сот) - работает

Если использовать
$ПоследнееЗначение.Сотрудники.ОсновноеНазначение(ЖРо.ids,:КонДата~~) AS [Назн $Справочник.Назначения]  - не работает

Ребята, всем спасибо
  
Наверх
 
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Ошибка ORDER BY ... a UNION operator.
Ответ #18 - 15. Сентября 2008 :: 09:11
Печать  
работает, пока не нарвется на несколько значений периодич.реквизита. Вот тогда будет вылет с ошибкой скуля.
Потому, все же советую использовать ПоследнееЗначение, но во внешнем селекте, а унион запрятать в подзапрос.
  
Наверх
 
IP записан
 
Stella0608
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 38
Зарегистрирован: 11. Марта 2009
Re: Ошибка ORDER BY ... a UNION operator.
Ответ #19 - 13. Марта 2009 :: 12:42
Печать  
Та же ошибка, не знаю как побороть

           
     |SELECT РегОстМ.Товар [Товар $Справочник.Номенклатура],
     |Sum(РегОстМ.СтоимостьОстаток) КонОстМоск,   
     |0 СуммаДоставкиФ, 0 СуммаНаСкладе, 0 СуммаДоставкиМ, 
     |0 СуммаЗаказа
     |FROM
     | $РегистрОстатки.ОстаткиТоваров(:КонДата~) AS РегОстМ      
     |GROUP BY РегОстМ.Товар         
     |UNION ALL
     |SELECT Рег.Товар [Товар $Справочник.Номенклатура], 
     |0 КонОстМоск,
     |СуммаДоставкиФ = case when Рег.ВидДвижения = :ВидДвижения1 then Sum(Рег.СуммаУЕОстаток) else 0 end,
     |СуммаНаСкладе = case when Рег.ВидДвижения = :ВидДвижения2 then Sum(Рег.СуммаСредняяОстаток) else 0 end,
     |СуммаДоставкиМ = case when Рег.ВидДвижения = :ВидДвижения3 then Sum(Рег.СуммаУЕОстаток) else 0 end,
     |0 СуммаЗаказа
     |FROM
     | $РегистрОстатки.ИнвойсДвижСум(:КонДата~) AS Рег
     |GROUP BY Рег.ВидДвижения, Рег.Товар   
     |UNION ALL
     |SELECT РегЗак2.Товар [Товар $Справочник.Номенклатура],
     |0 КонОстМоск,   
     |0 СуммаДоставкиФ, 0 СуммаНаСкладе, 0 СуммаДоставкиМ,
     |Sum(КоличествоОстаток*ЦенаЗаказа*Курс) СуммаЗаказа
     |FROM
     |  (      
     |SELECT РегЗак.Товар,
     |РегЗак.ЦенаЗаказа,
     |РегЗак.КоличествоОстаток, 
     |$ПоследнееЗначение.Валюты.Курс(СпрВал.ID, :КонДата) Курс 
     |FROM
     | $РегистрОстатки.Заказ(:КонДата~) AS РегЗак   
     |LEFT JOIN
     |  $Справочник.Валюты СпрВал ON СпрВал.ID = РегЗак.Валюта   
     |  ) AS РегЗак2      
     |GROUP BY РегЗак2.Товар
     |"; 

Первые 2 селекта объединяются нормально, 3й - ни в какую. Ни с 1, ни со вторым. Перемена мест запросов, равно как и подзапрос, проблемы не решает.
Что делать - не знаю, есть подозрение что не работает ПоследнееЗначение, но как тогда быть?
  
Наверх
ICQ  
IP записан
 
Злой Бобр
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Украина, Кривой Рог
Зарегистрирован: 07. Марта 2009
Пол: Мужской
Re: Ошибка ORDER BY ... a UNION operator.
Ответ #20 - 13. Марта 2009 :: 13:08
Печать  
[quote author=maximasj link=1150872965/0#14 date=1221218942]Помогите, плиз. не знаю как его правильно написать чтоб работал
[/quote]
И мне интересно как ты сможешь это объединить через UNION. По мне это как держа в одной руке кирпичи а в другой шлакоблок пытаться их объединить. Помоему типы столбцов должны быть одинаковые, иначе идти через подзапрос и джойнить.
Может и неправ - непинайте сильно  :-/
  

Если у вас есть деньги тогда мы идем к вам!!!
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать