Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Горячая тема (более 10 ответов) Ошибка ORDER BY ... a UNION operator. (число прочтений - 8354 )
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 [2] 
ОтправитьПечать