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

Откуда:
Сообщений: 17
Здравствуйте, Господа. Дан следующий SQL -запрос.
use voronezh_gorod
 select distinct a.[Номер],  a1.[ФИО], convert(char, b.[Показание])   as [Тек. показание], b.[Дата] as [Дата тек. показания]
 /*, b1.[Дата] as [Дата пред. показания]*/,'' as [Пред. показание], '' as [Дата пред. показания]  from [stack].[Лицевые счета] a,
 [stack].[Показания счетчиков] b, [stack].[!ОбщиеДанные] a1 /*[stack].[Показания счетчиков] b1*/
 where a.[ROW_ID]=b.[Показания-счет] /*and a.[ROW_ID]=b1.[Показания-счет]*/ 
and a1.[id_ls]=a.[ROW_ID] 

and not exists 
(select distinct  h.[Номер],  h1.[ФИО], convert(char, e.[Показание])  as [Тек. показание],
 e.[Дата] as [Дата тек. показания]/*,
 convert(char, d1.[Показание]) 
 as [Пред. показание]*/
 /*d1.[Дата] as [Дата пред. показания]*/ 
  from [stack].[Лицевые счета] h,
 [stack].[Показания счетчиков] e, [stack].[!ОбщиеДанные] h1 /*,  [stack].[Показания счетчиков] d1*/ 
 where h.[ROW_ID]=e.[Показания-счет] and /*c.[ROW_ID]=d1.[Показания-счет] and*/ h1.[id_ls]=e.[Показания-счет]
    and a.[Номер]=h.[Номер] and /* e.[Показание]>(b.[Показание]) and*/ e.[Дата]>b.[Дата]  
/*and month(d1.[Дата]) not like 3 or (month(d1.[Дата]) like 3 and year(d1.[Дата])<>2012)*/  
)

union
 select distinct a2.[Номер],  a3.[ФИО], ''   as [Тек. показание], '' as [Дата тек. показания]
 /*, b1.[Дата] as [Дата пред. показания]*/, convert(char, a4.[Показание]) as [Пред. показание], a4.[Дата] as [Дата пред. показания]
  from [stack].[Лицевые счета] a2,
 [stack].[Показания счетчиков] a4, [stack].[!ОбщиеДанные] a3 /*[stack].[Показания счетчиков] b1*/
 where a2.[ROW_ID]=a4.[Показания-счет] /*and a.[ROW_ID]=b1.[Показания-счет]*/ 
and a3.[id_ls]=a2.[ROW_ID] 
 
and not exists
 
(select distinct  h2.[Номер],  h4.[ФИО], convert(char, h3.[Показание])  as [Тек. показание],
 h3.[Дата] as [Дата тек. показания],
 convert(char, h3.[Показание]) 
 as [Пред. показание]
   from [stack].[Лицевые счета] h2,
 [stack].[Показания счетчиков] h3, [stack].[!ОбщиеДанные] h4 /*,  [stack].[Показания счетчиков] d1*/ 
 where h2.[ROW_ID]=h3.[Показания-счет] and  h4.[id_ls]=h3.[Показания-счет]
    and a2.[Номер]=h2.[Номер] and  h3.[Показание]>a4.[Показание] and [b]h3.[Дата]=b.[Дата] [/b]) 

При выполненииругается на следующее
The multi-part identifier "b.Дата" could not be bound.. (В коде выделено это жирным)
Подскажите пожалуйста как поступать в таком случае, если обязательно должна присутствовать связка с 1-ым selectом

Сообщение было отредактировано: 21 май 12, 16:36
21 май 12, 16:31    [12589995]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
midm1989
Подскажите пожалуйста как поступать в таком случае, если обязательно должна присутствовать связка с 1-ым selectом

union - это независимые запросы. В них нельзя ссылаться друг на друга
21 май 12, 16:35    [12590019]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
midm1989
Member

Откуда:
Сообщений: 17
Glory, так что же в данном случае делать в плане составления запроса, подскажи, если можешь
21 май 12, 16:42    [12590081]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
is_me
Member

Откуда: Нижний Новгород
Сообщений: 165
midm1989,

А где у Вас в запросе

select distinct a2.[Номер], a3.[ФИО], '' as [Тек. показание], '' as [Дата тек. показания]
/*, b1.[Дата] as [Дата пред. показания]*/, convert(char, a4.[Показание]) as [Пред. показание], a4.[Дата] as [Дата пред. показания]
from [stack].[Лицевые счета] a2,
[stack].[Показания счетчиков] a4, [stack].[!ОбщиеДанные] a3 /*[stack].[Показания счетчиков] b1*/
where a2.[ROW_ID]=a4.[Показания-счет] /*and a.[ROW_ID]=b1.[Показания-счет]*/ 
and a3.[id_ls]=a2.[ROW_ID] 

and not exists

(select distinct h2.[Номер], h4.[ФИО], convert(char, h3.[Показание]) as [Тек. показание],
h3.[Дата] as [Дата тек. показания],
convert(char, h3.[Показание]) 
as [Пред. показание]
from [stack].[Лицевые счета] h2,
[stack].[Показания счетчиков] h3, [stack].[!ОбщиеДанные] h4 /*, [stack].[Показания счетчиков] d1*/ 
where h2.[ROW_ID]=h3.[Показания-счет] and h4.[id_ls]=h3.[Показания-счет]
and a2.[Номер]=h2.[Номер] and h3.[Показание]>a4.[Показание] and h3.[Дата]=b.[Дата] ) 

выборка из таблицы с псевдонимом b?
21 май 12, 16:43    [12590085]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
RubinDm
Member

Откуда:
Сообщений: 461
midm1989, опишите суть задачи, попробуем помочь правильно ее решить.
21 май 12, 16:43    [12590086]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
midm1989
Member

Откуда:
Сообщений: 17
is_me, в первом select'е
21 май 12, 16:45    [12590107]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
midm1989
Glory, так что же в данном случае делать в плане составления запроса, подскажи, если можешь

Объясните себе и всем, зачем вам во втором запросе нужно обращаться именно к [stack].[Показания счетчиков] b, если у вас в этом же запросе есть [stack].[Показания счетчиков] h3 ?

А также
- зачем везде понатыканы distinct ?
- почему куча кода просто продублирована ?
21 май 12, 16:46    [12590119]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
is_me
Member

Откуда: Нижний Новгород
Сообщений: 165
midm1989
is_me, в первом select'е

А второй запрос после union не видит ее (b) в первом запросе.
Т.е. псевдонимы таблиц в первом и втором запросе не пересекаются,
т.е. в запросе
select t1.val from tTest1 t1
union
select t1.val from tTest2 t1

1 и 2 select выберут данные из разных таблиц t1
21 май 12, 16:51    [12590163]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
RubinDm
Member

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

и сообщите результат от select @@version.
спс
21 май 12, 16:53    [12590181]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
midm1989
Member

Откуда:
Сообщений: 17
RubinDm, в данной выборке существует с одним номером множество показаний с соответствующей датой. 1-ый селект должен выбирать номера с текущими (со свежей датой) показаниями и датой, а второй селект предшествующие показания соответсвенно. В 1-ом selecte not exist выбирает все данные не имеющие превосходящих по дате показаний, т.е. выбирает последние даты с показаниями на данный момент. А вот второй select с exist должен выбирать наибольшую дату но чтобы эта дата не была равна дате в 1-ом selecte (т.е. предпоследние значения).
21 май 12, 16:54    [12590196]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
midm1989
Member

Откуда:
Сообщений: 17
Glory, distinct продублирован потому что много существует в результате запроса дублирующихся номеров.Куча кода продублирована потому что нужен вроде бы как второй exist исключающий часть результатов 1-ого select'а
21 май 12, 16:59    [12590255]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
RubinDm
Member

Откуда:
Сообщений: 461
midm1989, попробуйте так:
select /* distinct */ -- дубликатов по идее не должно быть.
  [Номер]                 = a.[Номер]
, [ФИО]                   = a1.[ФИО]
, [Тек. показание]        = convert(char, [ПоследнееПоказание].[Показание])
, [Дата тек. показания]   = [ПоследнееПоказание].[Дата]
, [Пред. показание]       = convert(char, [ПредПоследнееПоказание].[Показание])
, [Дата пред. показания]  = [ПредПоследнееПоказание].[Дата]
from [stack].[Лицевые счета] a
join [stack].[!ОбщиеДанные] a1 on a1.[id_ls] = a.[ROW_ID]
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 [ПредПоследнееПоказание]


могут быть ошибки, не проверял, ибо не на чем.
21 май 12, 17:07    [12590346]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
midm1989
Glory, distinct продублирован потому что много существует в результате запроса дублирующихся номеров.

Вы в курсе, что distinct убирает полностью дублированные записи результата, а не дубликаты в отдельном поле ?
Вы в курсе, что UNION сам удаляет дублированные записи в результате ?
21 май 12, 20:17    [12591098]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
midm1989
Member

Откуда:
Сообщений: 17
RubinDm, только почему-то записей 349860 вместо 386910. Почему не подскажите?
22 май 12, 08:12    [12592041]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
RubinDm
Member

Откуда:
Сообщений: 461
midm1989, возможно потому, что в моем случае, на каждый лицевой счет получается одна запись, в которой сразу указаны показатели за текущий и за предыдущий периоды. данные за предыдущий период могут быть не указаны (если есть всего одно показание по счету - то оно текущее). В вашем случае для лицевого счета было бы две записи. Но не факт, что именно поэтому. Чтобы ответить мне нужны реальные данные, а их нет.
22 май 12, 12:42    [12593694]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
midm1989
Member

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

Выучить OUTER APPLY, не?
23 май 12, 10:30    [12598860]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
aleks2
Guest
RubinDm
midm1989, попробуйте так:

Неудовлетворительно.

;with
[Показания] as (
    select  [Дата], [Показание], [Показания-счет], row_number() over(partition by [Показания-счет] order by [Дата] desc) n
    from [stack].[Показания счетчиков]
    where row_number() over(partition by [Показания-счет] order by [Дата] desc) <=2
)
select 
  [Номер]                 = a.[Номер]
, [ФИО]                   = a1.[ФИО]
, [Тек. показание]        = convert(char, [ПоследнееПоказание].[Показание])
, [Дата тек. показания]   = [ПоследнееПоказание].[Дата]
, [Пред. показание]       = convert(char, [ПредПоследнееПоказание].[Показание])
, [Дата пред. показания]  = [ПредПоследнееПоказание].[Дата]
from [stack].[Лицевые счета] a
join [stack].[!ОбщиеДанные] a1 on a1.[id_ls] = a.[ROW_ID]
left outer join
(select * from [Показания] where n = 1) as [ПоследнееПоказание]
on [ПоследнееПоказание].[Показания-счет] = a.[ROW_ID]
left outer join
(select * from [Показания] where n = 2) as [ПредПоследнееПоказание]
on [ПредПоследнееПоказание].[Показания-счет] = a.[ROW_ID]
23 май 12, 10:42    [12598970]     Ответить | Цитировать Сообщить модератору
 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:06    [12599854]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
aleks2
Guest
midm1989
Он выполняет но выводит не все записи.


Битва экстрасексофф? Мы должны угадать, чего оно не выводит!
23 май 12, 13:29    [12600722]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
RubinDm
Member

Откуда:
Сообщений: 461
aleks2, напишите словами, что конкретно вы хотите получить на выходе.
23 май 12, 13:47    [12600932]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
RubinDm
Member

Откуда:
Сообщений: 461
aleks2, midm1989, напишите словами, что конкретно вы хотите получить на выходе
23 май 12, 14:07    [12601147]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
midm1989
Member

Откуда:
Сообщений: 17
RubinDm, на выходе я должен получить номер лицевого счета, потсавщика, объем начислений, предыдущее , текущее показания и их даты соответственно.Записи должны присутствовать ВСЕ.
23 май 12, 14:22    [12601323]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
Glory
Member

Откуда:
Сообщений: 104751
midm1989
.Записи должны присутствовать ВСЕ.

Записе все из какой таблицы ?
23 май 12, 14:25    [12601357]     Ответить | Цитировать Сообщить модератору
 Re: связка в SQL - запросе  [new]
midm1989
Member

Откуда:
Сообщений: 17
Glory, Лицевые счета. Но они теряются из-за join'ов. Хотя пробовал и через full outer join
23 май 12, 14:28    [12601392]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить