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

Откуда:
Сообщений: 17
Здравствуйте, Господа. Помогите пожалуйста с запросом . Почему-то ругается после добавления 2-ух последних строчек и таблиц с псевдонимами c и b


select /* distinct */ -- дубликатов по идее не должно быть.
 a.[Номер] as [Номер]                 
,[Поставщики-список] as [Поставщик],                     
case 
when convert(char, [ПоследнееПоказание].[Показание]) IS NULL then ''
else convert(char, [ПоследнееПоказание].[Показание]) 
end as [Тек. показание],
case
when convert(char, [ПоследнееПоказание].[Дата]) IS NULL then ''
else convert(char, [ПоследнееПоказание].[Дата])
end as [Дата тек. показания], 
case
when convert(char, [ПредПоследнееПоказание].[Показание]) IS NULL then ''
else convert(char, [ПредПоследнееПоказание].[Показание])
end as [Пред. показание] ,

case
when convert(char, [ПредПоследнееПоказание].[Дата]) IS NULL  then ''
/*when [ПредПоследнееПоказание].[Дата]  like '1900%'  then ''*/
else convert (char, [ПредПоследнееПоказание].[Дата])
end as [Дата пред. показания]
 
from [stack].[Лицевые счета] a, [stack].[Поставщики] b, [stack].[Лицевые счета] c

cross apply
  ( -- показания с самой большой датой
    select top 1 [Дата], [Показание]
    from [stack].[Показания счетчиков] T
    where T.[Показания-счет] = a.[ROW_ID]
   order by T.[Дата] desc
  ) as [ПоследнееПоказание]
outer apply
  ( -- показания с датой предыдущей от самой большой
    -- их может и не оказаться, если текущие показания
    -- являются единственными по счету.
    select top 1 [Дата], [Показание]
    from [stack].[Показания счетчиков] T
    where T.[Показания-счет] = a.[ROW_ID]
      and T.[Дата] < [ПоследнееПоказание].[Дата]
    order by T.[Дата] desc
  ) as [ПредПоследнееПоказание]
where b.[ДатКнЦ] = '2045-05-09'and b.[Счет-список поставщиков]=a.[ROW_ID]  AND
                     a.[Номер]=c.[Номер] and C.[Тип]=5 and a.[ROW_ID] = c.[Счета]



Пишет следующее:

Сообщение 4104, уровень 16, состояние 1, строка 1
The multi-part identifier "a.ROW_ID" could not be bound.
Сообщение 4104, уровень 16, состояние 1, строка 1
The multi-part identifier "a.ROW_ID" could not be bound.

Сообщение было отредактировано: 22 май 12, 17:02
22 май 12, 17:00    [12596110]     Ответить | Цитировать Сообщить модератору
 Re: sql-запрос  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
А если переписать так:
from [stack].[Лицевые счета] a cross join [stack].[Поставщики] b  cross join [stack].[Лицевые счета] c
22 май 12, 17:10    [12596181]     Ответить | Цитировать Сообщить модератору
 Re: sql-запрос  [new]
RubinDm
Member

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

я же показал вам как писать inner join (он же просто join) в Вашем предыдушем топике. Зачем Вы снова все переписали на таблицы через запятые??
22 май 12, 17:12    [12596193]     Ответить | Цитировать Сообщить модератору
 Re: sql-запрос  [new]
midm1989
Member

Откуда:
Сообщений: 17
RubinDm, к вам еще вопрос по поводу этой и предыдущей темы, почему выгружает не все записи, как вы думаете
23 май 12, 09:11    [12598392]     Ответить | Цитировать Сообщить модератору
 Re: sql-запрос  [new]
midm1989
Member

Откуда:
Сообщений: 17
RubinDm, RubinDm, я понял. Текущие показания могут быть пустыми.Как в cross apply сделать возможность быть этим полям пустыми?
23 май 12, 09:16    [12598411]     Ответить | Цитировать Сообщить модератору
 Re: sql-запрос  [new]
RubinDm
Member

Откуда:
Сообщений: 461
midm1989
Как в cross apply сделать возможность быть этим полям пустыми?
Вам уже отвечали в той теме - поменять cross apply на outer apply, и почитать как это работает, чтобы не писать код в слепую.
23 май 12, 11:42    [12599570]     Ответить | Цитировать Сообщить модератору
 Re: sql-запрос  [new]
midm1989
Member

Откуда:
Сообщений: 17
Ребята извините за повторное выставления кода. Но помгите досоставить запрос . Я подцепил таблицы. Он выполняет но выводит не все записи. Подскажите как надо. Вот код (я так понял тут теряются из-за join'ов):
select distinct -- дубликатов по идее не должно быть.
a.[Номер] as [Номер]
,
case
when convert(char, [ПоследнееПоказание].[Показание]) IS NULL then ''
else convert(char, [ПоследнееПоказание].[Показание])
end as [Тек. показание],
case
when convert(char, [ПоследнееПоказание].[Дата]) IS NULL then ''
else convert(char, [ПоследнееПоказание].[Дата])
end as [Дата тек. показания],
case
when convert(char, [ПредПоследнееПоказание].[Показание]) IS NULL then ''
else convert(char, [ПредПоследнееПоказание].[Показание])
end as [Пред. показание] ,

case
when convert(char, [ПредПоследнееПоказание].[Дата]) IS NULL then ''
/*when [ПредПоследнееПоказание].[Дата] like '1900%' then ''*/
else convert (char, [ПредПоследнееПоказание].[Дата])
end as [Дата пред. показания],
d.[Объем] as [Объем],
c.[Название] as [Поставщик]

from [stack].[Лицевые счета] a left
outer join [stack].[Поставщики] b on a.[ROW_ID]=b.[Счет-список поставщиков]
left outer join [stack].[Организации] c on b.[Поставщики-список]=c.[ROW_ID] right outer join
[stack].[!УслугиКвитанции] d on d.[idКвитанция]=a.[ROW_ID]



outer apply
( -- показания с самой большой датой
select top 1 [Дата], [Показание]
from [stack].[Показания счетчиков] T
where T.[Показания-счет] = a.[ROW_ID]
order by T.[Дата] desc
) as [ПоследнееПоказание]

outer apply
( -- показания с датой предыдущей от самой большой
-- их может и не оказаться, если текущие показания
-- являются единственными по счету.
select top 1 [Дата], [Показание]
from [stack].[Показания счетчиков] T
where T.[Показания-счет] = a.[ROW_ID]
and T.[Дата] < [ПоследнееПоказание].[Дата]
order by T.[Дата] desc
) as [ПредПоследнееПоказание]
where (b.[ДатКнЦ] = '2045-05-09' or b.[ДатКнЦ] is null) and (d.[Объем]<>0)
23 май 12, 12:04    [12599829]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить