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

Откуда:
Сообщений: 121
Добрый день! Вот мой запросик

select CarNumber,SendDate,ReceiveDate,IDSourceSt,IDDestSt from DL
where CarNumber = '50000140' and
SendDate between '20120101'and '20130327'
ORDER BY CarNumber,SendDate

Мне нужно сравнить 2 колонки IDSourceSt,IDDestSt по условию. Условие следующие, записал в excel, как то надо здесь вывести) =ЕСЛИ(D2=E1;1;0) То есть значение колонки IDDestSt должно быть равно значению колонки IDSourceSt которое строкой ниже.
Как это возможно сделать? Нужно получать результат, где не совпадает.
28 мар 13, 11:20    [14106048]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
case
  when IDSourceSt = IDDestSt  
   then 1 
   else 0
end
28 мар 13, 11:22    [14106058]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Maxx, не очень понятно куда вставить в мою конструкцию)
28 мар 13, 11:26    [14106094]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Добрый Э - Эх
Guest
PavelAA,

если версия позволяет - использовать LEAD/LAG, если не позволяет - имитировать их через TOP-1 подзапрос.
28 мар 13, 11:31    [14106125]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
PavelAA
значение колонки IDDestSt должно быть равно значению колонки IDSourceSt которое строкой ниже.
Как это возможно сделать? Нужно получать результат, где не совпадает.
перенумеровать (row_number() over...), объединить со следующей строкой (join), сравнить значения из текущей и следующей строк
28 мар 13, 11:31    [14106133]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Добрый Э - Эх
Guest
конкретные примеры реализации обсуждались чуть ли не вчера
28 мар 13, 11:32    [14106138]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
PavelAA
значение колонки IDDestSt должно быть равно значению колонки IDSourceSt которое строкой ниже.

недочитал :) Уже ответили
28 мар 13, 11:35    [14106159]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
А можно написать? :) Если не трудно) сервер 2012! Спасибо за ответы)
28 мар 13, 11:39    [14106182]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
PavelAA
А можно написать? :) Если не трудно) сервер 2012! Спасибо за ответы)

Посик по форуму по словам LEAD/LAG -даст желаемый результат
28 мар 13, 11:41    [14106199]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Добрый Э - Эх
Guest
PavelAA
А можно написать? :) Если не трудно) сервер 2012! Спасибо за ответы)
Написать можно, и нетрудно. Но ты же не привел тестовых данных в удобоваримом виде, на которых можно показывать решение....
28 мар 13, 11:47    [14106227]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Добрый Э - Эх, Если вы имеете ввиду кусочек примера то вот.

50000140 2012-11-16 14:49:13.000 2012-11-22 02:22:11.000 4792 19745
50000140 2012-11-22 12:49:26.000 2012-11-28 01:16:18.000 19745 4792
50000140 2012-11-28 00:00:00.000 2012-12-04 00:00:00.000 4792 19745
50000140 2012-11-28 04:45:00.000 2012-11-28 04:56:19.000 4792 4792
50000140 2012-11-28 06:46:30.000 2012-11-28 06:53:45.000 4792 4792
50000140 2012-11-28 15:32:00.000 2012-12-04 00:00:00.000 4792 19745
50000140 2012-12-05 00:00:00.000 2012-12-12 00:00:00.000 17652 19745
50000140 2012-12-05 13:31:00.000 2012-12-12 00:00:00.000 17652 19745
50000140 2012-12-14 00:00:00.000 2012-12-19 00:00:00.000 19745 4792
28 мар 13, 11:50    [14106245]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

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

Пункт 6
Вот ето имеют в виду
28 мар 13, 11:51    [14106251]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Наверно я что то не понимаю, но вроде свой запрос я выложил, пример его показал) Задачу вроде озвучил)
28 мар 13, 11:54    [14106267]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

Откуда:
Сообщений: 3683
PavelAA
Наверно я что то не понимаю, но вроде свой запрос я выложил, пример его показал) Задачу вроде озвучил)

В п.6 по указанной ссылке рекомендуется ещё предоставить:
автор
- скрипты создания таблиц;
- скрипты заполнения этих таблиц тестовыми данными;

То есть что-то вроде:
CREATE TABLE aaa(col1 int, col2 varchar(100), col3 datetime);
INSERT aaa VALUES(1, 'string 1', '20130327');
INSERT aaa VALUES(2, 'string 2', '20130328');

То есть чтобы сделать Ctrl-C, Ctrl-V, F5 и тут получить исходные данные, а не выколупывать их из:
автор
50000140 2012-11-16 14:49:13.000 2012-11-22 02:22:11.000 4792 19745
50000140 2012-11-22 12:49:26.000 2012-11-28 01:16:18.000 19745 4792
:-)
28 мар 13, 12:01    [14106299]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Гость333
тут же получить исходные данные
28 мар 13, 12:02    [14106305]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Добрый Э - Эх
Guest
PavelAA,
-- Твои тестовые данные:
with dl(CarNumber,SendDate,ReceiveDate,IDSourceSt,IDDestSt) as 
(select * from (values

(50000140,	'2012-11-16 14:49:13.000',	'2012-11-22 02:22:11.000',	4792,	 19745),
(50000140,	'2012-11-22 12:49:26.000',	'2012-11-28 01:16:18.000',	19745,    4792),
(50000140,	'2012-11-28 00:00:00.000',	'2012-12-04 00:00:00.000',	4792,	 19745),
(50000140,	'2012-11-28 04:45:00.000',	'2012-11-28 04:56:19.000',	4792,	 4792),
(50000140,	'2012-11-28 06:46:30.000',	'2012-11-28 06:53:45.000',	4792,	 4792),
(50000140,	'2012-11-28 15:32:00.000',	'2012-12-04 00:00:00.000',	4792,	 19745),
(50000140,	'2012-12-05 00:00:00.000',	'2012-12-12 00:00:00.000',	17652,    19745),
(50000140,	'2012-12-05 13:31:00.000',	'2012-12-12 00:00:00.000',	17652,   19745),
(50000140,	'2012-12-14 00:00:00.000',	'2012-12-19 00:00:00.000',	19745,    4792)
                ) v(q,a,z,w,s)
 )
--
-- Основной запрос (получение "следующих", "предыдущих" значений):
select *, 
       lead(IDSourceSt) over(partition by CarNumber order by SendDate) as next_IDSourceSt,
       lag(IDSourceSt) over(partition by CarNumber order by SendDate) as prev_IDSourceSt,
       lead(IDDestSt) over(partition by CarNumber order by SendDate) as next_IDDestSt,
       lag(IDDestSt) over(partition by CarNumber order by SendDate) as prev_IDDestSt
  from dl

ну а уж case написать, думаю и сам сможешь...
28 мар 13, 12:17    [14106404]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Прискорбно, но case написать сам не смогу) 1 день изучаю) Изучаю по поставленной задаче, параллельно читая книжку. Так что буду очень благодарен за полный ответ. Спасибо вам за помощь)
28 мар 13, 13:10    [14106776]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Сообщение 195, уровень 15, состояние 10, строка 6
lead не является известным имя встроенной функции.
28 мар 13, 13:11    [14106786]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavelAA
lead не является известным имя встроенной функции.

Зачем вы тогда заявляли "сервер 2012! " ?
28 мар 13, 13:12    [14106795]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
потому что такой и стоит... Может компонентов каких нет, я не знаю, может кусок недостающий просто. Я просто вставил то, что мне написали и показал ошибку.
28 мар 13, 13:24    [14106884]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavelAA
потому что такой и стоит...

И как вы это проверили ?
28 мар 13, 13:24    [14106889]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Glory
PavelAA
потому что такой и стоит...

И как вы это проверили ?
Зашел в справку и нажал о программе.
28 мар 13, 13:32    [14106944]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

Откуда:
Сообщений: 3683
PavelAA
Зашел в справку и нажал о программе.

Отлично, а теперь выполните запрос
select @@version
и выложите его результат.
28 мар 13, 13:34    [14106949]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavelAA
Зашел в справку и нажал о программе.

Какое отношение ваша клиентская программа имеет к серверу ?
28 мар 13, 13:34    [14106959]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Прошу прощения... Ошибку понял.... server 2008 ... Задача осталась :(
28 мар 13, 13:43    [14107031]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

Откуда:
Сообщений: 3683
declare @dl table (CarNumber int, SendDate datetime, ReceiveDate datetime, IDSourceSt int, IDDestSt int);

insert @dl values
(50000140,	'2012-11-16 14:49:13.000',	'2012-11-22 02:22:11.000',	4792,	 19745),
(50000140,	'2012-11-22 12:49:26.000',	'2012-11-28 01:16:18.000',	19745,    4792),
(50000140,	'2012-11-28 00:00:00.000',	'2012-12-04 00:00:00.000',	4792,	 19745),
(50000140,	'2012-11-28 04:45:00.000',	'2012-11-28 04:56:19.000',	4792,	 4792),
(50000140,	'2012-11-28 06:46:30.000',	'2012-11-28 06:53:45.000',	4792,	 4792),
(50000140,	'2012-11-28 15:32:00.000',	'2012-12-04 00:00:00.000',	4792,	 19745),
(50000140,	'2012-12-05 00:00:00.000',	'2012-12-12 00:00:00.000',	17652,    19745),
(50000140,	'2012-12-05 13:31:00.000',	'2012-12-12 00:00:00.000',	17652,   19745),
(50000140,	'2012-12-14 00:00:00.000',	'2012-12-19 00:00:00.000',	19745,    4792);

select * from @dl;

with cte as
(  select dl.CarNumber, dl.SendDate, dl.ReceiveDate, dl.IDSourceSt, dl.IDDestSt,
          row_number() over(partition by dl.CarNumber order by dl.SendDate) as rownum
   from @dl dl
)
select c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt, c2.IDDestSt as Prev_IDDestSt
from cte c1
     inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1
where c2.IdDestSt <> c1.IDSourceSt;

Только вот я не осилил назначение двух полей SendDate и ReceiveDate. Сдаётся мне, там надо искать ещё какие-нибудь вложенные периоды или что-то в этом роде.
28 мар 13, 14:07    [14107232]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Гость333,

select CarNumber,SendDate,ReceiveDate,IDSourceSt,IDDestSt from dl
where CarNumber = '50000140' and
SendDate between '20120101'and '20130327'

ORDER BY CarNumber,SendDate

with cte as
( select dl.CarNumber, dl.SendDate, dl.ReceiveDate, dl.IDSourceSt, dl.IDDestSt,
row_number() over(partition by dl.CarNumber order by dl.SendDate) as rownum
from dl
)
select c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt, c2.IDDestSt as Prev_IDDestSt
from cte c1
inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1
where c2.IdDestSt <> c1.IDSourceSt;

Ошибка: Сообщение 319, уровень 15, состояние 1, строка 7
Неправильный синтаксис около ключевого слова "with". Если эта инструкция является обобщенным табличным выражением, предложением xmlnamespaces или предложением в контексте отслеживания изменений, предыдущую инструкцию необходимо завершить точкой с запятой.
28 мар 13, 14:12    [14107272]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

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

Поставьте точку с запятой после "ORDER BY CarNumber,SendDate".
28 мар 13, 14:16    [14107299]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Синтаксические обозначения в Transact-SQL
;
Признак конца инструкции Transact-SQL. Хотя точка с запятой не требуется для большинства инструкций в данной версии SQL Server, она будет необходима в следующей версии.

То есть надо привыкать писать точку с запятой после каждой инструкции T-SQL :-)
28 мар 13, 14:20    [14107326]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Получилось 2 таблицы, первая моя, а вторая с 675619 строками... Не совсем понял что вышло)
28 мар 13, 14:22    [14107338]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

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

Добавьте в запрос, формирующий cte, условие "where CarNumber = '50000140' and SendDate between '20120101'and '20130327'".
28 мар 13, 14:33    [14107428]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Гость333
Синтаксические обозначения в Transact-SQL
;
Признак конца инструкции Transact-SQL. Хотя точка с запятой не требуется для большинства инструкций в данной версии SQL Server, она будет необходима в следующей версии.

То есть надо привыкать писать точку с запятой после каждой инструкции T-SQL :-)
ЯТД, когда реально потребуется - тогда и будем привыкать:)) А пока требуется только перед with :)
28 мар 13, 14:52    [14107607]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Спасибо, получилось) Не могли бы вы в кратце объяснить теперь)

with cte as // я так понимаю создаем таблицу ( что такое as?
( select CarNumber, SendDate, ReceiveDate, IDSourceSt, IDDestSt,
row_number() over(partition by CarNumber order by SendDate) as rownum
from dl //Далее выбираем все наши колонки из таблицы dl сортируем по SendDate, а что означает partition by CarNumber
)
select c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt, c2.IDDestSt as Prev_IDDestSt
from cte c1 // здесь как я понял, создаем строку, которую обзываем, тока не понятно c1 для чего :)
inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 // присоединяем по формуле
where c2.IdDestSt <> c1.IDSourceSt and c2.CarNumber = '50000140'and c2.SendDate between '20120101'and '20130327';
28 мар 13, 14:53    [14107610]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Никто не подскажет?(
28 мар 13, 15:57    [14108192]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavelAA
Никто не подскажет?(

т.е. вам все в запросе понятно, кроме этого as ?
28 мар 13, 16:02    [14108231]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Glory,
with cte as // я так понимаю создаем таблицу ( что такое as?
from dl //Далее выбираем все наши колонки из таблицы dl сортируем по SendDate, а что означает partition by CarNumber
from cte c1 // здесь как я понял, создаем строку, которую обзываем, тока не понятно c1 для чего :)
28 мар 13, 16:03    [14108250]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

Откуда:
Сообщений: 104751
http://msdn.microsoft.com/en-us/library/bb510741%28v=sql.105%29.aspx
28 мар 13, 16:05    [14108271]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
iap
Member

Откуда: Москва
Сообщений: 47099
PavelAA,

CTE - Common Table Expression
по-русски - Общее табличное выражение (ОТВ)
Читайте в BOL до прояснения.

PARTITION BY - это часть вызова оконных (windowed) функций - читайте BOL про OVER()

с1 - это алиас (псевдоним). Подробности - опять же в BOL.
28 мар 13, 16:09    [14108312]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
iap
Member

Откуда: Москва
Сообщений: 47099
Glory
http://msdn.microsoft.com/en-us/library/b510741%28v=sql.105%29.aspx
ТСу, небось, понятнее

http://msdn.microsoft.com/ru-ru/library/bb510741%28v=sql.105%29.aspx

будет?
28 мар 13, 16:11    [14108332]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Спасибо, буду читать!
28 мар 13, 16:13    [14108353]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Честно говоря поглядел по ссылке, вбил, инфы мало и мудрено(
28 мар 13, 16:25    [14108483]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavelAA
Честно говоря поглядел по ссылке, вбил, инфы мало и мудрено

Тогда может не стоит программировать ?
А то там в синтаксисе кроме AS еще более мудреные слова есть.
28 мар 13, 16:26    [14108502]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

Откуда:
Сообщений: 3683
iap
CTE - Common Table Expression
по-русски - Общее табличное выражение (ОТВ)
Читайте в BOL до прояснения.

Ага, только, на всякий случай, в BOL это переведено как "Обобщенное табличное выражение", например: Применение обобщенных табличных выражений
28 мар 13, 16:28    [14108519]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
iap
Member

Откуда: Москва
Сообщений: 47099
PavelAA
Честно говоря поглядел по ссылке, вбил, инфы мало и мудрено(
Зайдите вот сюда:
http://msdn.microsoft.com/ru-ru/library/bb510741(v=sql.100).aspx
Найдите в списке слева SELECT - и прочитайте (по ссылкам внутри походите)
Там и про CTE, и про алиасы.
28 мар 13, 16:33    [14108558]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
iap
Member

Откуда: Москва
Сообщений: 47099
Гость333
iap
CTE - Common Table Expression
по-русски - Общее табличное выражение (ОТВ)
Читайте в BOL до прояснения.

Ага, только, на всякий случай, в BOL это переведено как "Обобщенное табличное выражение", например: Применение обобщенных табличных выражений
Но правильнее "Общее", не находите?
В смысле "общее для данной инструкции (SELECT, DELETE, INSERT, UPDATE, MERGE)"
28 мар 13, 16:35    [14108575]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
iap
Member

Откуда: Москва
Сообщений: 47099
iap
Гость333
пропущено...

Ага, только, на всякий случай, в BOL это переведено как "Обобщенное табличное выражение", например: Применение обобщенных табличных выражений
Но правильнее "Общее", не находите?
В смысле "общее для данной инструкции (SELECT, DELETE, INSERT, UPDATE, MERGE)"
Хотя, наверно, я неправ
28 мар 13, 16:36    [14108582]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

Откуда:
Сообщений: 3683
PavelAA
from cte c1 // здесь как я понял, создаем строку, которую обзываем, тока не понятно c1 для чего :)

Как уже сказали, c1 — это псевдоним для cte. Без псевдонимов никак не обойтись, если в запросе одна и та же таблица используется более одного раза (скажем, тут cte используется два раза — без псевдонимов сервер не может узнать, из какого именно "cte" ему нужно взять тот или иной столбец). Также псевдонимы используют, например, для упрощения читабельности кода, упрощения дальнейшей модификации кода и т.д.
28 мар 13, 16:36    [14108586]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

Откуда:
Сообщений: 3683
iap
Но правильнее "Общее", не находите?

Может, и правильнее — я тоже называю его "общим" :-)
Также как индекс называю "кластерным", хотя в BOL он "кластеризованный".
Я просто на тот случай, если человек наберёт в Гугле "общее табличное выражение" и не найдёт ссылки на BOL.
28 мар 13, 16:39    [14108610]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Спасибо, прочел, объяснили, стало понятнее) а вот эта строка
row_number() over(partition by CarNumber order by SendDate) as rownum
28 мар 13, 16:41    [14108622]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Cygapb-007
Гость333
Синтаксические обозначения в Transact-SQL
пропущено...

То есть надо привыкать писать точку с запятой после каждой инструкции T-SQL :-)
ЯТД, когда реально потребуется - тогда и будем привыкать:)) А пока требуется только перед with :)

Ну вообще, как я понял, Microsoft пытается приучить ставить точки с запятой. Кроме WITH, они также нужны перед SEND, RECEIVE, может, ещё перед какими-то новыми ключевыми словами. Также, если некто привык писать точку с запятой перед WITH, этот некто может потом удивляться, почему падает создание представления:
CREATE VIEW xxx AS
; WITH cte AS (...)
SELECT * FROM cte;
:-)

Да и вообще, как-то это некрасиво выглядит (строго ИМХО, конечно).
28 мар 13, 16:44    [14108652]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Друзья, возникла следующая проблема :(

Немного доработал,
elect  InvNumber, CarNumber,SendDate,ReceiveDate,IDSourceSt,IDDestSt,ExpCode,OutInfo  from dl 
where ExpCode <> '88888888'  and  CarNumber = '50000801' and OutInfo = '1' and
SendDate between '20130101'and '20130327'

ORDER BY CarNumber,SendDate;

with cte as
(  select CarNumber, SendDate, ReceiveDate, IDSourceSt, IDDestSt,ExpCode,InvNumber,OutInfo,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl where SendDate between '20130101'and '20130327' and ExpCode <> '88888888' and ExpCode <> '2222222'  and OutInfo = '1' and CarNumber <> 0 
   and CarNumber= '50000801'
)
select c1.InvNumber, c2.invnumber, c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.ExpCode, c1.IDSourceSt, c1.IDDestSt,c1.ExpCode,c1.OutInfo, c2.IDDestSt as Prev_IDDestSt, c2.CarNumber as Prev_CarNumber
from cte c1
     inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
where c2.IdDestSt <> c1.IDSourceSt ;


Вот что выдает : Рис 1 запрос, рис 2 в базе как, то есть в запросе он отсортировал не в том порядке в итоге ошибка. Как подправить? Подскажите пожалуйста.

К сообщению приложен файл. Размер - 75Kb
2 апр 13, 13:59    [14126477]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Одну строку не скопировал, не понятно почему выделяет 3 строку во второй таблице, если предыдущее значение правильное.
Кусок из excel.
50000801 И0814468 04.01.2013 7:03 Карталы I (эксп.) Аллагуват 0 True
50000801 И0814468 04.01.2013 7:03 Карталы I (эксп.) Черниковка-восточная 0 True
50000801 ЭФ880947 04.02.2013 20:15 Черниковка-восточная Новоуфимская 1 True
50000801 ЭФ937150 06.02.2013 5:03 Новоуфимская Сибай 1 True
50000801 ЭФ983397 10.02.2013 6:38 Сибай Новоуфимская 1 True
50000801 ЭХ257698 13.02.2013 17:25 Новоуфимская Оренбург 1 True
50000801 ЭХ362778 18.02.2013 9:58 Оренбург Загородняя 1 True
50000801 ЭЦ171330 07.03.2013 15:14 Загородняя Сорочинская 1 True
50000801 ЭЦ351936 12.03.2013 18:00 Сорочинская Загородняя 1 True
2 апр 13, 14:22    [14126629]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

Откуда:
Сообщений: 3683
PavelAA
Вот что выдает : Рис 1 запрос, рис 2 в базе как, то есть в запросе он отсортировал не в том порядке в итоге ошибка.

Какая ошибка? Текст ошибки можно увидеть?
2 апр 13, 15:05    [14126854]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Ошибки нет, просто почему то сортирует неправильно :) Или отображает) Вы если посмотрите на картинку где цифра 1, первые 4 строчки, это как сортирует запрос!
А вот как выдает программа откуда берутся данные
50000801 И0814468 04.01.2013 7:03:00 Карталы I (эксп.) Аллагуват
50000801 И0814468 04.01.2013 7:03:00 Карталы I (эксп.) Аллагуват
50000801 И0814468 04.01.2013 7:03:00 Карталы I (эксп.) Черниковка-восточная
50000801 ЭФ880947 04.02.2013 20:15:11 Черниковка-восточная Новоуфимская

Получается, что (50000801 ЭФ880947 04.02.2013 20:15:11 Черниковка-восточная Новоуфимская) не должна попадать во вторую таблицу. Программа берет данные из той же таблицы.
2 апр 13, 15:31    [14127008]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

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

Если SendDate в таблице дублируется, то делайте сортировку по какому-то другому критерию, который обеспечит требуемый порядок записей. Когда данные выдаёт программа, по каким полям делается сортировка?
2 апр 13, 15:47    [14127096]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
В том то и дело, что по полю SendDate. Сейчас сам попробую поиграться с условиями)
2 апр 13, 16:11    [14127275]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

Откуда:
Сообщений: 3683
PavelAA
В том то и дело, что по полю SendDate.

То есть вы посмотрели в текст запроса, выполняемого программой, и увидели там, что нет никакой другой сортировки, кроме как по SendDate?
2 апр 13, 16:17    [14127327]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
select  InvNumber, CarNumber,SendDate,ReceiveDate,IDSourceSt,IDDestSt,ExpCode,OutInfo  from dl 
where ExpCode <> '88888888'    and  CarNumber = '50000801'  --and OutInfo = '1'
and SendDate between '20130101'and '20130402'

order by SendDate ASC ;

with cte as
(  select CarNumber, SendDate, ReceiveDate, IDSourceSt, IDDestSt,ExpCode,InvNumber,OutInfo,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl where SendDate between '20130101'and '20130402' and ExpCode <> '88888888' and ExpCode <> '2222222'   and CarNumber <> 0 --and OutInfo = '1'
   and CarNumber= '50000801'
)
select c1.InvNumber, c2.invnumber, c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.ExpCode, c1.IDSourceSt, c1.IDDestSt,c1.ExpCode,c1.OutInfo, c2.IDDestSt as Prev_IDDestSt
from cte c1
     inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
where c2.IdDestSt <> c1.IDSourceSt ;


Вот когда я не ставлю условие, что OutInfo = '1' он мне выдает правильно как на картинке, как ставлю результат не верный :( Мне нужны только единички где, в программе когда ставишь 1 строки не перемешиваются. Не знаю как быть в данной ситуации...

К сообщению приложен файл. Размер - 69Kb
2 апр 13, 16:25    [14127388]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
С данной проблемой справился :) Возник такой вопросик, у меня получается таблица соединена по CarNumber, а как мне соединить по другому полю из другой таблица (Например таблица называется tell поле TesId. И второй вопрос, чтобы сначала если есть заполненные колонки IdIn и IdOut, то по ним смотрела проверку, если же нет то так как сейчас :) буду благодарен за помощь) Не ругайтесь пожалуйста :)
3 апр 13, 15:58    [14131888]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Помогите пожалуйста :( Как быть с CarNumber, если у них тока одно поле общее... во второй таблице нет CarNumber...
3 апр 13, 17:40    [14132357]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
PavelAA,
занчит у вас где-то есть еще таблица гдеи прописанны "другие" связи
Иили исчите как таки связать -иначе никак
3 апр 13, 17:44    [14132370]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
может можно как то к исходной таблице прицепить таблицу tell, соединяются они по полю
IDSourceSt и testid

select InvNumber, CarNumber,SendDate,ReceiveDate,IDSourceSt,IDDestSt,ExpCode,OutInfo,StatusRecord from dl
where ExpCode <> '88888888' and ExpCode <> '2222222' and CarNumber = '50000140' and SendDate between '20130101'and '20130403' and OutInfo <> '0'
and StatusRecord = '0'
order by SendDate;
with cte as
( select CarNumber, SendDate, ReceiveDate, IDSourceSt, IDDestSt,ExpCode,InvNumber,OutInfo,
row_number() over(partition by CarNumber order by SendDate) as rownum
from dl where SendDate between '20130101'and '20130403' and ExpCode <> '88888888' and ExpCode <> '2222222' and CarNumber <> 0 and OutInfo <> '0' and StatusRecord = '0'
-- and CarNumber= '50000405'
)
select c1.InvNumber, c2.invnumber, c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.ExpCode, c1.IDSourceSt, c1.IDDestSt,c1.ExpCode,c1.OutInfo, c2.IDDestSt as Prev_IDDestSt
from cte c1
inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1
where c2.IdDestSt <> c1.IDSourceSt
order by c1.CarNumber

Очень нужна ваша помощь(
4 апр 13, 09:10    [14133779]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavelAA
может можно как то к исходной таблице прицепить таблицу tell, соединяются они по полю
IDSourceSt и testid

Вы спрашиваете разрешение на соединение в своем запросе ?
или просите провести анализ вашей структуры для выяснения, как могут быть соединены произвольные таблицы ?
4 апр 13, 09:19    [14133808]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Glory
PavelAA
может можно как то к исходной таблице прицепить таблицу tell, соединяются они по полю
IDSourceSt и testid

Вы спрашиваете разрешение на соединение в своем запросе ?
или просите провести анализ вашей структуры для выяснения, как могут быть соединены произвольные таблицы ?


Я хочу понять можно ли к полученной таблице в результате соединения, присоединить еще одну. Или я неправильно мыслю?
4 апр 13, 09:43    [14133894]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavelAA
Я хочу понять можно ли к полученной таблице в результате соединения, присоединить еще одну.

JOIN можно использовать сколь угодно много раз. Пока у сервера хватит ресурсов.
4 апр 13, 09:47    [14133910]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Glory
PavelAA
Я хочу понять можно ли к полученной таблице в результате соединения, присоединить еще одну.

JOIN можно использовать сколь угодно много раз. Пока у сервера хватит ресурсов.


Вот я и хочу попробовать) Но не знаю как по синтаксису вставить :(
4 апр 13, 09:51    [14133926]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavelAA
Вот я и хочу попробовать) Но не знаю как по синтаксису вставить

Открыть хелп и изучить синитаксис не пробовали ?
4 апр 13, 09:54    [14133942]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Glory
PavelAA
Вот я и хочу попробовать) Но не знаю как по синтаксису вставить

Открыть хелп и изучить синтаксис не пробовали ?


Спасибо за совет, я просто привык на примерах изучать.... Еще вопрос про условие остается актуальным, как смотреть приоритетное условие...
4 апр 13, 10:02    [14133987]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavelAA
Спасибо за совет, я просто привык на примерах изучать...

Вы не поверите, но в хелпе и примеры есть
Кроме того, join есть даже в вашем запросе.
Что вам мешает разобрать свой же запрос в качестве примера ?
4 апр 13, 10:04    [14133993]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Прошу прощения за тупые вопросы, возможно они такими и являются... К сожалению в моей структуре почему то не получается...

Со своим запросом я более менее разобрался, посмотрел по частям. Сейчас стоит задача, чтобы так же все считало, но у меня нет CarNumber в моей таблице. Так же я не очень понимаю как в sql выглядят условия ( до этого работал с 1С ) , как в sql записать условие, что если есть IDSourceSt2, IDDestSt2 ( значения заполнены), то брать мою формулу по ним, если их нет, то как сейчас. Еще раз прошу прощения за такие вопросы... В выходные засяду за изучением, сейчас такой возможности не имею Не посылайте в google и хелп :(
order by  SendDate;
with cte as
(  select CarNumber, SendDate, ReceiveDate, IDSourceSt, IDDestSt,ExpCode,InvNumber,OutInfo,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl where SendDate between '20130101'and '20130403' and ExpCode <> '88888888' and ExpCode <> '2222222'   and CarNumber <> 0 and OutInfo <> '0' and StatusRecord = '0'
  -- and CarNumber= '50000405'
) 
select c1.InvNumber, c2.invnumber, c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.ExpCode, c1.IDSourceSt, c1.IDDestSt,c1.ExpCode,c1.OutInfo, c2.IDDestSt as Prev_IDDestSt
from cte c1
     inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
where c2.IdDestSt <> c1.IDSourceSt 
order by c1.CarNumber 
4 апр 13, 10:59    [14134359]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

Откуда:
Сообщений: 3683
PavelAA
как в sql записать условие, что если есть IDSourceSt2, IDDestSt2 ( значения заполнены), то брать мою формулу по ним, если их нет, то как сейчас

Что такое IDSourceSt2, IDDestSt2? В запросе их нет.
Как выглядит ваша формула?

Вот такое хотите?
CASE
    WHEN IDSourceSt2 IS NOT NULL AND IDDestSt2 IS NOT NULL
    THEN брать мою формулу по ним
    ELSE как сейчас
END
4 апр 13, 11:10    [14134447]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Гость333 во-первых спасибо вам уже за помощь)

Объясню суть, c1.IDSourceSt, c1.IDDestSt - это столбцы которые мы задействуем в формуле, у них числовое обозначение. В таблице tell есть поле Name, которое содержит имя ( для примера пусть будет Иванов) и поле TesId которое равно полю IDSourceSt из таблицы dl.

1. Мне надо как то исключить вот такие варианты

IDSourceSt IDDestSt
4792 14454
14450 4792

В тексте это выглядит так
IDSourceSt IDDestSt
Петров Иванов
Иванов П Петров

Иванов и Иванов П это по сути одно и тоже, что видно из таблицы TesId

2. В первом запросе который вы написали, нужно чтобы если поля заполнены IDSourceSt2 IDDestSt2 то сравнивало их, а если не заполнено, тогда брало значения как сейчас. Надеюсь понятно объяснил(
4 апр 13, 11:29    [14134597]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavelAA
и поле TesId которое равно полю IDSourceSt из таблицы dl.

И что тогда мешает соединить эти таблицы по этим полям ?
4 апр 13, 11:32    [14134615]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Glory
PavelAA
и поле TesId которое равно полю IDSourceSt из таблицы dl.

И что тогда мешает соединить эти таблицы по этим полям ?


Мешает то, что тогда нарушается формула, потому что CarNumber там нет.
select  InvNumber, CarNumber,SendDate,ReceiveDate,IDSourceSt,IDDestSt,ExpCode,OutInfo,StatusRecord,SourceStCode,DestStCode  from dl 
where ExpCode <> '88888888'  and ExpCode <> '2222222'  and  CarNumber = '50000140' and SendDate between '20130101'and '20130403' and OutInfo <> '0' 
and StatusRecord = '0'
order by  SendDate;
with cte as
(  select CarNumber, SendDate, ReceiveDate, IDSourceSt, IDDestSt,ExpCode,InvNumber,OutInfo,SourceStCode,DestStCode,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl where SendDate between '20130101'and '20130403' and ExpCode <> '88888888' and ExpCode <> '2222222'   and CarNumber <> 0 and OutInfo <> '0' and StatusRecord = '0'
  -- and CarNumber= '50000405'
)
select c1.InvNumber, c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.ExpCode, c1.SourceStCode, c1.DestStCode,c1.ExpCode,c1.OutInfo, c2.Code as Prev_IDDestSt
from cte c1
     [color=red]inner join tell c2 on c2.TesId = c1.SourceStCode --and c2.rownum = c1.rownum - 1 
where c2.TesId <> c1.SourceStCode[/color]
order by c1.CarNumber 
4 апр 13, 11:39    [14134669]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
inner join tell c2 on c2.TesId = c1.SourceStCode and c2.rownum = c1.rownum - 1
where c2.TesId <> c1.SourceStCode
4 апр 13, 11:41    [14134677]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavelAA
Мешает то, что тогда нарушается формула, потому что CarNumber там нет.

Причем тут CarNumber ?
"и поле TesId которое равно полю IDSourceSt из таблицы dl." - что мешает сделать соединение по этим полям ?
4 апр 13, 11:41    [14134683]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Glory, к сожалению я не знаю как... если начинаю ниже всего этого прописывать ругается, видимо неправильно прописываю.
4 апр 13, 11:48    [14134724]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavelAA
Glory, к сожалению я не знаю как...

Что как ?
После таблицы dl написать join вы не в силах что ли ?
4 апр 13, 11:49    [14134738]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Glory
PavelAA
Glory, к сожалению я не знаю как...

Что как ?
После таблицы dl написать join вы не в силах что ли ?


В силах, как прицепить к данной конструкции не в силах.
4 апр 13, 11:57    [14134822]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavelAA
В силах, как прицепить к данной конструкции не в силах.

Взять и написать руками.
После FROM dl написать JOIN.
4 апр 13, 12:01    [14134855]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Glory, прошу прощения, но кроме ваших советов не программировать, обратиться в хелп и гугл, помощи я не увидел, не вижу смысла тогда таких форумов. Если мой вопрос кажется вам очень глупым, можно просто не отвечать.
Вопрос актуален, жду ответа.... Гость333 вся надежда на тебя)
4 апр 13, 12:07    [14134899]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavelAA
Glory, прошу прощения, но кроме ваших советов не программировать, обратиться в хелп и гугл, помощи я не увидел, не вижу смысла тогда таких форумов. Если мой вопрос кажется вам очень глупым, можно просто не отвечать.

Т.е. надо за вас написать весь текст запроса ?
Сами вы не в состоянии даже просто в _указанное_ место добавить ни символа ?
4 апр 13, 12:08    [14134919]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
from cte c1
    inner join tell c2 on c2.TesId = c1.SourceStCode and c2.rownum = c1.rownum - 1 
    inner join  dl dl1 on dl.IDSourceSt = c2.TesId   --- я так понимаю ето строчка которая нужна ?
where c2.TesId <> c1.SourceStCode
4 апр 13, 12:12    [14134953]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Maxx
from cte c1
    inner join tell c2 on c2.TesId = c1.SourceStCode and c2.rownum = c1.rownum - 1 
    inner join  dl dl1 on dl.IDSourceSt = c2.TesId   --- я так понимаю ето строчка которая нужна ?
where c2.TesId <> c1.SourceStCode


нет, rownum берется из cte так что уже строка неверная, в tell нет Carnumber.
4 апр 13, 12:15    [14134976]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

Откуда:
Сообщений: 104751
Maxx
from cte c1
    inner join tell c2 on c2.TesId = c1.SourceStCode and c2.rownum = c1.rownum - 1 
    inner join  dl dl1 on dl.IDSourceSt = c2.TesId   --- я так понимаю ето строчка которая нужна ?
where c2.TesId <> c1.SourceStCode

Да таблица dl у автора внутри cte
А он тупит и не может туда добавить джойн.
И ждет когда разжуют, проглотят и переварят за него.
4 апр 13, 12:15    [14134977]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
with cte as
(  .......
   from  dl 
       inner join tell ...... ? 
 
)

мдя.....
4 апр 13, 12:18    [14134987]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Maxx Спасибо :)
Glory да, автор глупый... действительно очень просто, но одна строчка значительно сократила бы ваше и мое время...

проблема остается, по поводу сравнения и условия.
4 апр 13, 12:31    [14135092]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavelAA
но одна строчка значительно сократила бы ваше и мое время...

Т.е. прямого указания "После FROM dl написать JOIN. " недостаточно ?
Вы либо не читаете ответы, либо вам не нужны объяснения, а только готовый текст
4 апр 13, 12:33    [14135123]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

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

а чем вот ето не подходит ?
Вапрос
4 апр 13, 12:34    [14135134]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Glory
PavelAA
но одна строчка значительно сократила бы ваше и мое время...

Т.е. прямого указания "После FROM dl написать JOIN. " недостаточно ?
Вы либо не читаете ответы, либо вам не нужны объяснения, а только готовый текст


У меня ругался в том месте, читаю и принимаю критику. Я потом еще раз подправил и получилось.
4 апр 13, 12:40    [14135182]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

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

Бла-бла-бла
4 апр 13, 12:41    [14135193]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Вот так написал, выделяет when
4 апр 13, 13:51    [14135637]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Случайно отправил :( Вот кусок текста

inner join cte c2 on c2.CarNumber = c1.CarNumber
and c2.rownum = c1.rownum - 1
When c1.ForeignSourceStCode Not Null and c1.ForeignDestStCode Not Null
then c2.ForeignDestStCode <> c1.ForeignSourceStCode
else
c2.DestStCode <> c1.SourceStCode
order by c1.CarNumber
4 апр 13, 13:51    [14135641]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
PavelAA
Вот так написал, выделяет when

как ?
4 апр 13, 13:52    [14135643]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
PavelAA,
when без case не бывает
case
  when
  then
  else
end
4 апр 13, 13:54    [14135659]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Maxx
PavelAA,
when без case не бывает
case
  when
  then
  else
end

Пишет : Неправильный синтаксис около ключевого слова "Case".

select c1.InvNumber, c2.invnumber, c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.SourceStCode, c1.DestStCode,c1.ExpCode,c1.OutInfo,c1.Code,c1.ForeignSourceStCode,c1.ForeignDestStCode, c2.DestStCode as Prev_IDDestSt

from cte c1

inner join cte c2 on c2.CarNumber = c1.CarNumber
and c2.rownum = c1.rownum - 1
Case
When c1.ForeignSourceStCode Not Null and c1.ForeignDestStCode Not Null then c2.ForeignDestStCode <> c1.ForeignSourceStCode
else c2.DestStCode <> c1.SourceStCode
End

order by c1.CarNumber
4 апр 13, 14:01    [14135701]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
PavelAA,
 and Case 
4 апр 13, 14:02    [14135713]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
iap
Member

Откуда: Москва
Сообщений: 47099
PavelAA,

CASE - это функция, возвращающая одно значение определённого типа.
Причём, в MSSQL булевого типа нет!
4 апр 13, 14:03    [14135722]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
iap
Member

Откуда: Москва
Сообщений: 47099
Maxx
PavelAA,
 and Case 
Он же там ещё пытается вернуть результат сравнения
4 апр 13, 14:04    [14135729]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
iap
Maxx
PavelAA,
 and Case 

Он же там ещё пытается вернуть результат сравнения

ето будет следущее Ему то предложили ее использовать для расчета формулы,а не для условия джойна
4 апр 13, 14:06    [14135744]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
CASE

Вот мне просто инетерсно ,сколько еще статей с документации сюда запостят
4 апр 13, 14:10    [14135762]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Все очень печально :( Какой есть выход?
4 апр 13, 14:11    [14135766]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
select c1.InvNumber, c2.invnumber, c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.SourceStCode, c1.DestStCode,c1.ExpCode,c1.OutInfo,c1.Code,c1.ForeignSourceStCode,c1.ForeignDestStCode, c2.DestStCode as Prev_IDDestSt

from cte c1

inner join cte c2 on c2.CarNumber = c1.CarNumber
where c2.rownum = c1.rownum - 1
   and  c1.ForeignSourceStCode Not Null 
   and c1.ForeignDestStCode Not Null
   and  c2.ForeignDestStCode <> c1.ForeignSourceStCod
UNION
 select c1.InvNumber, c2.invnumber, c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.SourceStCode, c1.DestStCode,c1.ExpCode,c1.OutInfo,c1.Code,c1.ForeignSourceStCode,c1.ForeignDestStCode, c2.DestStCode as Prev_IDDestSt

from cte c1

inner join cte c2 on c2.CarNumber = c1.CarNumber
where c2.rownum = c1.rownum - 1
   and  c1.ForeignSourceStCode IS  Null 
   and c1.ForeignDestStCode IS  Null
   and  c2.DestStCode <> c1.SourceStCode  
order by c1.CarNumber

Хотя я уже не уверен ,что вы вообще в итоге хотите получить
4 апр 13, 14:17    [14135815]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Maxx, я так понял условия не сработают, я хотел чтобы если c1.ForeignSourceStCode Not Null and c1.ForeignDestStCode Not Null ( то есть если не пустые) тогда c2.ForeignDestStCode <> c1.ForeignSourceStCode иначе как было c2.DestStCode <> c1.SourceStCode
4 апр 13, 14:24    [14135859]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

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

покажите код где вы ето вписывате ? хоть с закоментироваными вами строками...
4 апр 13, 14:27    [14135877]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Maxx, я про Case говорил). Просто по вашему коде, если я правильно понял получается, что мы объединяем 2 условия. Ругается сразу Неправильный синтаксис около ключевого слова "Null". Выделяя c1.ForeignSourceStCode и Null
4 апр 13, 14:38    [14135942]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Сам разобрался, IS Not Null вот так работает!
4 апр 13, 14:51    [14136004]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
PavelAA,
вместо
автор
c1.ForeignSourceStCode Not Null

надо
автор
c1.ForeignSourceStCode IS NOT NULL
- опечатался
вы хоть базовое в T-SQL знаете ?
4 апр 13, 14:51    [14136006]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Здравствуйте, никак не могу добавить условие( Вот в чем проблема. Надо как то связать, чтобы и у IDDestSt при значении 14454 был CodeGroupe 98130 и у IDSourceSt при значении 14450 был CodeGroupe 98130. В самой таблице я это забил. (
Копипаст qStation
Id, CodeGroup
14450 98130
14451 98130
14452 98130
14453 98130
14454 98130

Если связываю так
 select CarNumber, SendDate, ReceiveDate, ExpCode,InvNumber,OutInfo,IDSourceSt,IDDestSt,ForeignSourceStCode,ForeignDestStCode,CodeGroup,name,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl       inner join qStation on  IDSourceSt = Id


то
IDSourceSt,IDDestSt,CodeGroupe
19745 14454 97040
14450 4792 98130

если

 select CarNumber, SendDate, ReceiveDate, ExpCode,InvNumber,OutInfo,IDSourceSt,IDDestSt,ForeignSourceStCode,ForeignDestStCode,CodeGroup,name,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl       inner join qStation on  IDDestSt = Id


то
IDSourceSt,IDDestSt,CodeGroupe
19745 14454 98130
14450 4792 93240
17 апр 13, 15:10    [14193180]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Вопрос актуален!
18 апр 13, 08:47    [14196306]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Может как то к этой конструкции можно привязать еще раз, чтобы Codegroup получить предыдущий?
with cte as
(  select CarNumber, SendDate, ReceiveDate, ExpCode,InvNumber,OutInfo,IDSourceSt,IDDestSt,ForeignSourceStCode,ForeignDestStCode,CodeGroup,name,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl       inner join qStation on   IDSourceSt = fa.dbo.qstation.id 
   where SendDate between '20130101'and '20130403'  and ExpCode <> '2222222'   and CarNumber <> 0 and OutInfo <> '0' and StatusRecord = '0'
  and ExpCode <> '88888888' 
  and CarNumber= '50000140'  

) 
select c1.InvNumber,c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt,c1.CodeGroup,c1.name, c2.IDDestSt as Prev_IDDestSt

from cte c1

inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1  
18 апр 13, 11:32    [14197270]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Подниму в надежде на ответ(
19 апр 13, 10:19    [14201982]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Попроставляйте алисаы плиз,бо понять с какой таблицы идет какая колонка не реально,а перечитывать все 5 стр и вникать - некогда.
19 апр 13, 10:25    [14202028]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Вот весь код. Как уже писал связываю с таблицей "inner join qStation on IDSourceSt = fa.dbo.qstation.id "
Вот структура qStation ( написал нужные колонки). Id из qstation равен значениям из dl колонкам (IDSourceSt,IDDestSt).
Id, CodeGroup
14450 98130
14451 98130
14452 98130
14453 98130
14454 98130


with cte as
(  select CarNumber, SendDate, ReceiveDate, ExpCode,InvNumber,OutInfo,IDSourceSt,IDDestSt,ForeignSourceStCode,ForeignDestStCode,CodeGroup,name,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl       inner join qStation on   IDSourceSt = fa.dbo.qstation.id 
   where SendDate between '20130101'and '20130403'  and ExpCode <> '2222222'   and CarNumber <> 0 and OutInfo <> '0' and StatusRecord = '0'
  and ExpCode <> '88888888' 
  --and CarNumber= '50000140'  

) 
select c1.InvNumber,  c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt, c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.CodeGroup,c2.CodeGroup,c1.name,c2.name, c2.IDDestSt as Prev_IDDestSt

from cte c1

inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
where 
     c1.ForeignSourceStCode IS Not Null 
   and c1.ForeignDestStCode IS Not Null
   and     c2.ForeignDestStCode <> c1.ForeignSourceStCode 
UNION
 select c1.InvNumber,  c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt,c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.CodeGroup,c2.CodeGroup,c1.name,c2.name,c2.IDDestSt as Prev_IDDestSt

from cte c1

inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
where  
     c1.ForeignSourceStCode IS  Null  
   and c1.ForeignDestStCode IS  Null
   and  c2.IDDestSt <> c1.IDSourceSt  
order by c1.CarNumber
19 апр 13, 10:37    [14202110]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
вот ето
автор
row_number() over(partition by CarNumber order by SendDate)

как т о соотноситься с вашими предположеними по
автор
d, CodeGroup
14450 98130
14451 98130
14452 98130
14453 98130
14454 98130

Т.е. всегда ли преидущеей дате будет соответвовать предидущий CodeGroup ?
19 апр 13, 10:50    [14202210]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Maxx
вот ето
автор
row_number() over(partition by CarNumber order by SendDate)

как т о соотноситься с вашими предположеними по
автор
d, CodeGroup
14450 98130
14451 98130
14452 98130
14453 98130
14454 98130

Т.е. всегда ли преидущеей дате будет соответвовать предидущий CodeGroup ?


Не всегда, как раз данный расхождения и нужно найти! В таком ввиде все работает, но у меня есть такие ситуации, когда IDDestSt = 14454, а IDSourceSt = 14450 вот здесь он и показывает эту строку. В данном случае не вдаваясь в подробности( у них одно наименование) надо как то исключить данные строки, поэтому есть таблица qstation где у этих id один CodeGroup

id, CodeGroup
14450 98130
14451 98130
14452 98130
14453 98130
14454 98130
19 апр 13, 11:02    [14202268]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
PavelAA
IDDestSt = 14454, а IDSourceSt = 14450

а по каким критериям исключать ? какой в итоге должен попасть в выборку то ?
19 апр 13, 11:13    [14202333]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Maxx
PavelAA
IDDestSt = 14454, а IDSourceSt = 14450

а по каким критериям исключать ? какой в итоге должен попасть в выборку то ?


CodeGroup у них одинаковый 98130, в выборке должны остаться те где из прошлый строки IDDestSt не равен IDSourceSt.
19 апр 13, 11:25    [14202412]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
PavelAA
IDDestSt не равен IDSourceSt.

ну и где у вас такое условие ?
19 апр 13, 11:33    [14202462]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Maxx
PavelAA
IDDestSt не равен IDSourceSt.

ну и где у вас такое условие ?


Сравнивает строки, c2.IDDestSt as Prev_IDDestSt показывает предыдущий IDDestSt. В данном коде работает, действительно выдает только где с2.IDDestSt <> с1.IDSourceSt
19 апр 13, 11:39    [14202516]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
:( нет ответа
19 апр 13, 14:44    [14204202]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
with cte as
(  select CarNumber, SendDate, ReceiveDate, ExpCode,InvNumber,OutInfo,IDSourceSt,IDDestSt,ForeignSourceStCode,ForeignDestStCode,CodeGroup,name,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl       inner join qStation on   IDSourceSt = fa.dbo.qstation.id 
   where SendDate between '20130101'and '20130403'  and ExpCode <> '2222222'   and CarNumber <> 0 and OutInfo <> '0' and StatusRecord = '0'
  and ExpCode <> '88888888' 
  --and CarNumber= '50000140'  

) 

 select c1.InvNumber,  c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt,c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.CodeGroup,c2.CodeGroup,c1.name,c2.name,c2.IDDestSt as Prev_IDDestSt

from cte c1

inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
where  
     c1.ForeignSourceStCode IS  Null  
   and c1.ForeignDestStCode IS  Null
   and  c2.IDDestSt <> c1.IDSourceSt  
order by c1.CarNumber


т.е. вот так вы получаете правильный результат ?
19 апр 13, 15:31    [14204640]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Maxx
with cte as
(  select CarNumber, SendDate, ReceiveDate, ExpCode,InvNumber,OutInfo,IDSourceSt,IDDestSt,ForeignSourceStCode,ForeignDestStCode,CodeGroup,name,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl       inner join qStation on   IDSourceSt = fa.dbo.qstation.id 
   where SendDate between '20130101'and '20130403'  and ExpCode <> '2222222'   and CarNumber <> 0 and OutInfo <> '0' and StatusRecord = '0'
  and ExpCode <> '88888888' 
  --and CarNumber= '50000140'  

) 

 select c1.InvNumber,  c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt,c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.CodeGroup,c2.CodeGroup,c1.name,c2.name,c2.IDDestSt as Prev_IDDestSt

from cte c1

inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
where  
     c1.ForeignSourceStCode IS  Null  
   and c1.ForeignDestStCode IS  Null
   and  c2.IDDestSt <> c1.IDSourceSt  
order by c1.CarNumber


т.е. вот так вы получаете правильный результат ?


да, тока без этого inner join qStation on IDSourceSt = fa.dbo.qstation.id
19 апр 13, 15:42    [14204749]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

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

тогда зачем он вам нужен ?
19 апр 13, 15:51    [14204841]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Maxx
PavelAA,

тогда зачем он вам нужен ?
чтобы взять GroupCode и убрать значения которые я описал ранее
19 апр 13, 16:20    [14205098]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
PavelAA
Maxx
PavelAA,

тогда зачем он вам нужен ?
чтобы взять GroupCode и убрать значения которые я описал ранее

тогда как без етого джойна он может возращать правильный результат ?????
19 апр 13, 16:27    [14205168]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
тем более у вас там и так есть ключ по которому джойниться,..как вариант ниже в самом запросе приджойните таблицу
19 апр 13, 16:34    [14205239]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Maxx
тем более у вас там и так есть ключ по которому джойниться,..как вариант ниже в самом запросе приджойните таблицу

вот здесь джойнится к полученной таблице, поэтому и возвращает правильный результат.
inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1

Как к этой структуре приджойнить я не знаю!
19 апр 13, 16:37    [14205279]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
with cte as
(  select CarNumber,
              SendDate
            , ReceiveDate
            , ExpCode
            ,InvNumber
            ,OutInfo
            ,IDSourceSt
            ,IDDestSt
            ,ForeignSourceStCode
            ,ForeignDestStCode
            , name,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl    
   where SendDate between '20130101'and '20130403'  
      and ExpCode <> '2222222'   
      and CarNumber <> 0 
      and OutInfo <> '0' 
      and StatusRecord = '0'
      and ExpCode <> '88888888' 
  --and CarNumber= '50000140'  

) 
select c1.InvNumber,
            c1.CarNumber
            , c1.SendDate
            , c1.ReceiveDate
            , c1.IDSourceSt
            , c1.IDDestSt
            ,q1.CodeGroup
            ,c1.name
            , c2.IDDestSt as Prev_IDDestSt
           ,q2.CodeGroup  as Prev_GroupCode
from cte c1

inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
 inner join qStation q1 on   c1.IDSourceSt = fa.dbo.qstation.id
 inner join  qStation  q2 on   c2.IDSourceSt = fa.dbo.qstation.id
19 апр 13, 16:45    [14205343]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Maxx
with cte as
(  select CarNumber,
              SendDate
            , ReceiveDate
            , ExpCode
            ,InvNumber
            ,OutInfo
            ,IDSourceSt
            ,IDDestSt
            ,ForeignSourceStCode
            ,ForeignDestStCode
            , name,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl    
   where SendDate between '20130101'and '20130403'  
      and ExpCode <> '2222222'   
      and CarNumber <> 0 
      and OutInfo <> '0' 
      and StatusRecord = '0'
      and ExpCode <> '88888888' 
  --and CarNumber= '50000140'  

) 
select c1.InvNumber,
            c1.CarNumber
            , c1.SendDate
            , c1.ReceiveDate
            , c1.IDSourceSt
            , c1.IDDestSt
            ,q1.CodeGroup
            ,c1.name
            , c2.IDDestSt as Prev_IDDestSt
           ,q2.CodeGroup  as Prev_GroupCode
from cte c1

inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
 inner join qStation q1 on   c1.IDSourceSt = fa.dbo.qstation.id
 inner join  qStation  q2 on   c2.IDSourceSt = fa.dbo.qstation.id


Завтра попробую, спасибо!
21 апр 13, 19:26    [14210320]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Не удалось привязать составной идентификатор "fa.dbo.qstation.id". Путь точно правильно указываю, выше когда связывал работало... И еще нет теперь сравнения по параметрам, у меня ведь сравнивало, c1.ForeignSourceStCode IS Not Null
and c1.ForeignDestStCode IS Not Null тогда по ним брало...
З.Ы. Попробовал связать по GroupID а не по fa.dbo.qstation.id, вот здесь ошибка осталась inner join qStation q2 on c2.IDSourceSt = GroupID (Неоднозначное имя столбца "GroupID".)
22 апр 13, 09:01    [14211166]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

Откуда:
Сообщений: 3683
PavelAA
вот здесь ошибка осталась inner join qStation q2 on c2.IDSourceSt = GroupID (Неоднозначное имя столбца "GroupID".)

Возьмите себе за правило предварять алиасом любое имя столбца в запросе SELECT. При написании запросов вам сразу же невероятно полегчает, вот увидите.
Чтобы имя столбца было однозначным, вместо GroupID напишите q2.GroupID.

PavelAA
Не удалось привязать составной идентификатор "fa.dbo.qstation.id".

Это потому, что fa.dbo.qstation — это не алиас. Алиасы в данном случае — q1, q2.
22 апр 13, 10:51    [14211559]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Гость333
PavelAA
вот здесь ошибка осталась inner join qStation q2 on c2.IDSourceSt = GroupID (Неоднозначное имя столбца "GroupID".)

Возьмите себе за правило предварять алиасом любое имя столбца в запросе SELECT. При написании запросов вам сразу же невероятно полегчает, вот увидите.
Чтобы имя столбца было однозначным, вместо GroupID напишите q2.GroupID.

PavelAA
Не удалось привязать составной идентификатор "fa.dbo.qstation.id".

Это потому, что fa.dbo.qstation — это не алиас. Алиасы в данном случае — q1, q2.


Спасибо, запомню! Записал вот так, в Prev_GroupCode показывает предыдущий CodeGroup по IDSourceSt...
with cte as
(  select CarNumber, SendDate, ReceiveDate, ExpCode,InvNumber,OutInfo,IDSourceSt,IDDestSt,ForeignSourceStCode,ForeignDestStCode,CodeGroup,name,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl       inner join qStation on   IDSourceSt = fa.dbo.qstation.id 
   where SendDate between '20130101'and '20130403'  and ExpCode <> '2222222'   and CarNumber <> 0 and OutInfo <> '0' and StatusRecord = '0'
  and ExpCode <> '88888888' 
  --and CarNumber= '50000140' CodeGroupe = SourceStCode or CodeGroup = DestStCode 

) 
select c1.InvNumber,  c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt, c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.CodeGroup,c2.CodeGroup,c1.name,c2.name, c2.IDDestSt as Prev_IDDestSt,q2.CodeGroup  as Prev_GroupCode

from cte c1

inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
inner join qStation q1 on   c1.IDSourceSt = q1.GroupID
 inner join  qStation  q2 on   c2.IDSourceSt = q2.GroupID
where 
     c1.ForeignSourceStCode IS Not Null 
   and c1.ForeignDestStCode IS Not Null
   and     c2.ForeignDestStCode <> c1.ForeignSourceStCode 
UNION
 select c1.InvNumber,  c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt,c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.CodeGroup,c2.CodeGroup,c1.name,c2.name,c2.IDDestSt as Prev_IDDestSt,q2.CodeGroup  as Prev_GroupCode
from cte c1

inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
inner join qStation q1 on   c1.IDSourceSt = q1.GroupID
 inner join  qStation  q2 on   c2.IDSourceSt = q2.GroupID
where  
     c1.ForeignSourceStCode IS  Null  
   and c1.ForeignDestStCode IS  Null
   and  c2.IDDestSt <> c1.IDSourceSt  
order by c1.CarNumber
22 апр 13, 11:12    [14211656]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Кажется нашел ошибку, сейчас проверю)
22 апр 13, 11:15    [14211669]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Все, вроде все заработало Спасибо всем за помощь))))
22 апр 13, 11:25    [14211711]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
У меня мини вопрос) А можно все это как то упростить) Глянул в инете есть функция ISNull через нее ведь можно? И Join-ов много получается, как то их в одно место перенсти???
with cte as
(  select CarNumber, SendDate, ReceiveDate, ExpCode,InvNumber,OutInfo,IDSourceSt,IDDestSt,ForeignSourceStCode,ForeignDestStCode,CodeGroup,name,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl       inner join qStation on   IDSourceSt = fa.dbo.qstation.id 
   where SendDate between '20130101'and '20130403'  and ExpCode <> '2222222'   and CarNumber <> 0 and OutInfo <> '0' and StatusRecord = '0'
  and ExpCode <> '88888888' 
  --and CarNumber= '50000140' 
) 
select c1.InvNumber,  c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt, c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.CodeGroup,c2.IDDestSt as Prev_IDDestSt,q2.CodeGroup  as Prev_GroupCode

from cte c1

inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
inner join qStation q1 on   c1.IDSourceSt = q1.GroupID
inner join  qStation  q2 on   c2.IDDestSt = q2.GroupID
where 
     c1.ForeignSourceStCode IS Not Null 
   and c1.ForeignDestStCode IS Not Null
   and     c2.ForeignDestStCode <> c1.ForeignSourceStCode and q2.CodeGroup <> c1.CodeGroup
UNION
 select c1.InvNumber,  c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt,c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.CodeGroup,c2.IDDestSt as Prev_IDDestSt,q2.CodeGroup  as Prev_GroupCode
from cte c1

inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
inner join qStation q1 on   c1.IDSourceSt = q1.GroupID
inner join  qStation  q2 on   c2.IDDestSt = q2.GroupID
where  
     c1.ForeignSourceStCode IS  Null  
   and c1.ForeignDestStCode IS  Null
   and  c2.IDDestSt <> c1.IDSourceSt  and q2.CodeGroup <> c1.CodeGroup
order by c1.CarNumber
22 апр 13, 13:56    [14212724]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
немного сократил :) Как теперь условие объединения изменить на ISNull что то не получается
with cte as
(  select CarNumber, SendDate, ReceiveDate, ExpCode,InvNumber,OutInfo,IDSourceSt,IDDestSt,ForeignSourceStCode,ForeignDestStCode,CodeGroup,name,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl       inner join qStation q1 on   IDSourceSt = q1.ID
   where SendDate between '20130101'and '20130403'  and ExpCode <> '2222222'   and CarNumber <> 0 and OutInfo <> '0' and StatusRecord = '0'
  and ExpCode <> '88888888' 
  --and CarNumber= '50000140' 
) 
select c1.InvNumber,  c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt, c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.CodeGroup,c2.IDDestSt as Prev_IDDestSt,q2.CodeGroup  as Prev_GroupCode

from cte c1

inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
inner join  qStation  q2 on   c2.IDDestSt = q2.ID
where 
     c1.ForeignSourceStCode IS Not Null 
   and c1.ForeignDestStCode IS Not Null
   and     c2.ForeignDestStCode <> c1.ForeignSourceStCode and q2.CodeGroup <> c1.CodeGroup
UNION
 select c1.InvNumber,  c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt,c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.CodeGroup,c2.IDDestSt as Prev_IDDestSt,q2.CodeGroup  as Prev_GroupCode
from cte c1

inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
inner join  qStation  q2 on   c2.IDDestSt = q2.ID
where  
     c1.ForeignSourceStCode IS  Null  
   and c1.ForeignDestStCode IS  Null
   and  c2.IDDestSt <> c1.IDSourceSt  and q2.CodeGroup <> c1.CodeGroup
order by c1.CarNumber
22 апр 13, 17:34    [14214265]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Все еще актуально)
23 апр 13, 10:34    [14216904]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
автор
немного сократил :) Как теперь условие объединения изменить на ISNull что то не получается
ето в каком месте то ? Пример вашего колда который не получаеться можно увидеть ?
23 апр 13, 11:31    [14217301]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Maxx
автор
немного сократил :) Как теперь условие объединения изменить на ISNull что то не получается
ето в каком месте то ? Пример вашего колда который не получаеться можно увидеть ?


Все работает, спасибо) просто теперь хочу вот от этого объединения избавиться UNION, прочел что можно через исключения ISNull(..,..) но что то по логике даже не могу пока заменить (

select c1.InvNumber,  c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt, c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.CodeGroup,c2.IDDestSt as Prev_IDDestSt,q2.CodeGroup  as Prev_GroupCode

from cte c1

inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
inner join  qStation  q2 on   c2.IDDestSt = q2.ID
where 
     c1.ForeignSourceStCode IS Not Null 
   and c1.ForeignDestStCode IS Not Null
   and     c2.ForeignDestStCode <> c1.ForeignSourceStCode and q2.CodeGroup <> c1.CodeGroup
UNION
 select c1.InvNumber,  c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt,c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.CodeGroup,c2.IDDestSt as Prev_IDDestSt,q2.CodeGroup  as Prev_GroupCode
from cte c1

inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
inner join  qStation  q2 on   c2.IDDestSt = q2.ID
where  
     c1.ForeignSourceStCode IS  Null  
   and c1.ForeignDestStCode IS  Null
   and  c2.IDDestSt <> c1.IDSourceSt  and q2.CodeGroup <> c1.CodeGroup
23 апр 13, 11:43    [14217383]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

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

не стоит етого делать в where вас появиться тогда OR ,а ето далеко не лучший случай
INSULL - не для етого ,вы б почитали про него
23 апр 13, 11:47    [14217414]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Maxx
PavelAA,

не стоит етого делать в where вас появиться тогда OR ,а ето далеко не лучший случай
INSULL - не для етого ,вы б почитали про него


ISNull вы возможно имели ввиду) Ну если вам не сложно я бы хотел посмотреть с таким вариантом) Просто вообще не представляю как условия эти переписать( Буду очень вам благодарен.
23 апр 13, 11:57    [14217490]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Записал вот так, результаты выборки разные :( не могу найти косяк, вроде условие правильное...

select c1.InvNumber,  c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt, c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.CodeGroup,c2.IDDestSt as Prev_IDDestSt,q2.CodeGroup  as Prev_GroupCode
,ISNull(c1.ForeignSourceStCode,c1.IDSourceSt),ISNULL(c1.ForeignDestStCode,c2.IDDestSt)
from cte c1

inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
inner join  qStation  q2 on   c2.IDDestSt = q2.ID
where  
     c1.ForeignSourceStCode IS  Null  
   and c1.ForeignDestStCode IS  Null
   and  c2.IDDestSt <> c1.IDSourceSt  and q2.CodeGroup <> c1.CodeGroup or  c1.ForeignSourceStCode IS  Not Null  
   and c1.ForeignDestStCode IS  Not Null and c2.ForeignDestStCode <> c1.ForeignSourceStCode and q2.CodeGroup <> c1.CodeGroup
order by c1.CarNumber
23 апр 13, 13:50    [14218445]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
where  (
     c1.ForeignSourceStCode IS  Null  
   and c1.ForeignDestStCode IS  Null
   and  c2.IDDestSt <> c1.IDSourceSt  and q2.CodeGroup <> c1.CodeGroup
) or ( c1.ForeignSourceStCode IS  Not Null  
   and c1.ForeignDestStCode IS  Not Null and c2.ForeignDestStCode <> c1.ForeignSourceStCode and q2.CodeGroup <> c1.CodeGroup
)


а так ?
23 апр 13, 14:50    [14218877]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Maxx
where  (
     c1.ForeignSourceStCode IS  Null  
   and c1.ForeignDestStCode IS  Null
   and  c2.IDDestSt <> c1.IDSourceSt  and q2.CodeGroup <> c1.CodeGroup
) or ( c1.ForeignSourceStCode IS  Not Null  
   and c1.ForeignDestStCode IS  Not Null and c2.ForeignDestStCode <> c1.ForeignSourceStCode and q2.CodeGroup <> c1.CodeGroup
)


а так ?


Вы имеете ввиду просто поставить скобки? Тоже самое, но сейчас правильно, проверил по excel 2 таблицы)
23 апр 13, 14:55    [14218921]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Добрый всем день! Объясните пожалуйста, как связать в данной ситуации?
Есть Дата в первой колонке (20130305) и надо определить, если она попадает в IS_Actual = 0, то не показывать ее.
В третей таблице указаны промежутки, но нет поля актуальности =(

То есть в данном случае, как мне исключить дату из первой таблицы используя вторую и третью =(

К сообщению приложен файл. Размер - 57Kb
15 май 13, 11:52    [14297909]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
ребят, очень срочно надо(
15 май 13, 14:45    [14299533]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Все еще актуально :(
17 май 13, 10:04    [14309565]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Не могли бы вы предоставить скрипт создания таблиц и заполнения?
17 май 13, 10:12    [14309622]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Сергей Викт.
Не могли бы вы предоставить скрипт создания таблиц и заполнения?

1 таблица
with cte as
(  select CarNumber, SendDate, ReceiveDate, ExpCode, InvNumber, OutInfo, IDSourceSt, IDDestSt, ForeignSourceStCode, ForeignDestStCode, Q1.CodeGroup scg, Q2.CodeGroup dcg,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl 
     inner join qStation q1 on IDSourceSt = q1.ID
     inner join qStation q2 on IDDestSt = q2 .ID
   where SendDate between '20130101'and '20130403' 
     and ExpCode <> '2222222'  
        and ExpCode <> '88888888' 
        and CarNumber <> 0 
      
) 
select c1.InvNumber, c2.InvNumber,  c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt, c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.scg,c2.IDDestSt as Prev_IDDestSt,c2.dcg  as Prev_GroupCode,ISNull(c1.ForeignSourceStCode,c1.IDSourceSt),ISNULL(c1.ForeignDestStCode,c1.IDDestSt)
  from cte c1
    inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
  where   c1.ForeignSourceStCode IS Null and c1.ForeignDestStCode IS Null and  c2.IDDestSt <> c1.IDSourceSt  and c2.dcg <> c1.scg 
      
      or  c1.ForeignSourceStCode IS Not Null and c1.ForeignDestStCode IS Not Null and c2.ForeignDestStCode <> c1.ForeignSourceStCode and c2.dcg <> c1.scg 
	  
order by c1.CarNumber

2 таблица
SELECT * FROM FA.ROSOwnersInterval('01.01.2000', GETDATE(), -1)
3 таблица
select * from R_OS_OWNERS
17 май 13, 11:02    [14310041]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
PavelAA
Сергей Викт.
Не могли бы вы предоставить скрипт создания таблиц и заполнения?

1 таблица
with cte as
(  select CarNumber, SendDate, ReceiveDate, ExpCode, InvNumber, OutInfo, IDSourceSt, IDDestSt, ForeignSourceStCode, ForeignDestStCode, Q1.CodeGroup scg, Q2.CodeGroup dcg,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl 
     inner join qStation q1 on IDSourceSt = q1.ID
     inner join qStation q2 on IDDestSt = q2 .ID
   where SendDate between '20130101'and '20130403' 
     and ExpCode <> '2222222'  
        and ExpCode <> '88888888' 
        and CarNumber <> 0 
      
) 
select c1.InvNumber, c2.InvNumber,  c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt, c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.scg,c2.IDDestSt as Prev_IDDestSt,c2.dcg  as Prev_GroupCode,ISNull(c1.ForeignSourceStCode,c1.IDSourceSt),ISNULL(c1.ForeignDestStCode,c1.IDDestSt)
  from cte c1
    inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
  where   c1.ForeignSourceStCode IS Null and c1.ForeignDestStCode IS Null and  c2.IDDestSt <> c1.IDSourceSt  and c2.dcg <> c1.scg 
      
      or  c1.ForeignSourceStCode IS Not Null and c1.ForeignDestStCode IS Not Null and c2.ForeignDestStCode <> c1.ForeignSourceStCode and c2.dcg <> c1.scg 
	  
order by c1.CarNumber

2 таблица
SELECT * FROM FA.ROSOwnersInterval('01.01.2000', GETDATE(), -1)
3 таблица
select * from R_OS_OWNERS


Павел, это выборка. А мне бы хотелось посмотреть как они созданы и заполнены данными.
т.е. CREATE TABLE R_OS_OWNERS(...)

И несколько простых инсертов в эти таблицы.
17 май 13, 11:15    [14310119]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
К сожалению не могу это предоставить, могу только в виде текста для примера... :(
17 май 13, 11:24    [14310199]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
PavelAA
К сожалению не могу это предоставить, могу только в виде текста для примера... :(

На ум первое, что пришло создать представление из 2х таблиц (2 и 3), чтобы был и IDшник, и дата начала периода, и дата конца периода, и актуальность, а затем вытащить то, что надо удалить..

CREATE VIEW v_ForPavel AS
SELECT t2.ID_OS as ID_OS,t2.Data as [Data] ,t3.de as [de],t2.Is_Actual as [Is_Actual]
FROM
Table2 t2 JOIN Table3 t3 ON
t2.DATA=t3.db AND t2.ID_OS=t3.carnumber
GO

/*Проверьте сначала, выдаст ли оно правильный ответ, затем можно запустить удаление, если все ОК*/
SELECT *
FROM table1 t1 LEFT JOIN v_ForPavel v ON
v.ID_OS=t1.carnumber /*Или как там у вас это поле называется*/
AND
t1.Data>=v.Data AND t1.Data<=v.de 
17 май 13, 11:45    [14310406]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Или через CTE можно попробовать

[SRC SQL]WITH v_ForPavel AS (
SELECT t2.ID_OS as ID_OS,t2.Data as [Data] ,t3.de as [de],t2.Is_Actual as [Is_Actual]
FROM
Table2 t2 JOIN Table3 t3 ON
t2.DATA=t3.db AND t2.ID_OS=t3.carnumber)

/*Проверьте сначала, выдаст ли оно правильный ответ, затем можно запустить удаление, если все ОК*/
SELECT *
FROM table1 t1 LEFT JOIN v_ForPavel v ON
v.ID_OS=t1.carnumber /*Или как там у вас это поле называется*/
AND
t1.Data>=v.Data AND t1.Data<=v.de [/SQL]
17 май 13, 11:46    [14310415]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
WITH v_ForPavel AS (
SELECT t2.ID_OS as ID_OS,t2.Data as [Data] ,t3.de as [de],t2.Is_Actual as [Is_Actual]
FROM
Table2 t2 JOIN Table3 t3 ON
t2.DATA=t3.db AND t2.ID_OS=t3.carnumber)

/*Проверьте сначала, выдаст ли оно правильный ответ, затем можно запустить удаление, если все ОК*/
SELECT *
FROM table1 t1 LEFT JOIN v_ForPavel v ON
v.ID_OS=t1.carnumber /*Или как там у вас это поле называется*/
AND
t1.Data>=v.Data AND t1.Data<=v.de 


Блин, опять с тегами запутался)
17 май 13, 11:46    [14310420]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Честно говоря ниче не понял =((( как в мою конструкцию впихнуть(
17 май 13, 14:11    [14311889]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
У вас задача выбрать все поля из таблицы один, где дата не актуальная, так?
Вот этот запрос это и делает. Или он не работает? Если надо удалить то вместо SELECT ... FROM пишите DELETE
17 май 13, 14:13    [14311906]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

Откуда:
Сообщений: 3683
PavelAA
К сожалению не могу это предоставить, могу только в виде текста для примера... :(

Почему не можете? Что этому препятствует?
17 май 13, 14:31    [14312038]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Сергей Викт.
У вас задача выбрать все поля из таблицы один, где дата не актуальная, так?
Вот этот запрос это и делает. Или он не работает? Если надо удалить то вместо SELECT ... FROM пишите DELETE


В принципе да, только не удалить, не отображать))) удалять ничего не надо) Надо чтобы в первом запросе показывались только актуальные вагоны, проверяя по полю из первого запроса. Ниже же 2 запроса которые можно использовать для первого, как вставить вашу конструкцию в первый запрос?)
17 май 13, 14:33    [14312057]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
PavelAA
Сергей Викт.
У вас задача выбрать все поля из таблицы один, где дата не актуальная, так?
Вот этот запрос это и делает. Или он не работает? Если надо удалить то вместо SELECT ... FROM пишите DELETE


В принципе да, только не удалить, не отображать))) удалять ничего не надо) Надо чтобы в первом запросе показывались только актуальные вагоны, проверяя по полю из первого запроса. Ниже же 2 запроса которые можно использовать для первого, как вставить вашу конструкцию в первый запрос?)

with NEWCTE 
(
/*тут вставляете и выбираете ту часть, которая джойнит таблицы*/
SELECT t2.ID_OS as ID_OS,t2.Data as [Data] ,t3.de as [de],t2.Is_Actual as [Is_Actual]
FROM
Table2 t2 JOIN Table3 t3 ON
t2.DATA=t3.db AND t2.ID_OS=t3.carnumber
/*Ну там переделываете под те поля и таблицы, которые у вас есть*/
),
cte as
(  select CarNumber, SendDate, ReceiveDate, ExpCode, InvNumber, OutInfo, IDSourceSt, IDDestSt, ForeignSourceStCode, ForeignDestStCode, Q1.CodeGroup scg, Q2.CodeGroup dcg,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl 
     inner join /*тут делаете джоин по ID с NEWCTE */qStation q1 on IDSourceSt = q1.ID
     inner join qStation q2 on IDDestSt = q2 .ID
   where SendDate between '20130101'and '20130403' 
/*PЗдесь добавляете условие: t1.Data>=v.Data AND t1.Data<=v.de 
*/
     and ExpCode <> '2222222'  
        and ExpCode <> '88888888' 
        and CarNumber <> 0 
      
) 
select c1.InvNumber, c2.InvNumber,  c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt, c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.scg,c2.IDDestSt as Prev_IDDestSt,c2.dcg  as Prev_GroupCode,ISNull(c1.ForeignSourceStCode,c1.IDSourceSt),ISNULL(c1.ForeignDestStCode,c1.IDDestSt)
  from cte c1
    inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
  where   c1.ForeignSourceStCode IS Null and c1.ForeignDestStCode IS Null and  c2.IDDestSt <> c1.IDSourceSt  and c2.dcg <> c1.scg 

      
      or  c1.ForeignSourceStCode IS Not Null and c1.ForeignDestStCode IS Not Null and c2.ForeignDestStCode <> c1.ForeignSourceStCode and c2.dcg <> c1.scg 
	  
order by c1.CarNumber


Просто вы не даёте реальной структуры, и как переложить с table1, table2 и table3 на реальные данные это уже ваша задача.
17 май 13, 14:47    [14312201]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
К сожалению ничего не получается, но все равно спасибо)
17 май 13, 15:15    [14312422]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
PavelAA,

не за что. Просто была бы структура таблиц и какие-то тест данные, то можно было бы со 100% уверенностью вам написать что делать. А так, только в качестве примера.

Glory
6. Если Ваш вопроc связан с созданием какого-то запроса, то предоставление Вами следующих материалов может существенно ускорить нахождение решения:
- скрипты создания таблиц;
- скрипты заполнения этих таблиц тестовыми данными;
- описание желаемого результата на примере тестовых данных.
(эти данные лучше офрмлять с использованием специальных тэгов, которые повысят их читабельность)
Подумайте также над тем, чтобы описать решаемую Вами задачу целиком. Возможно, что тот способ решения, который Вы стремитесь воплотить в жизнь, не является наилучшим, а лишь кажется Вам таковым. Например, вместо вопроса "Как добавить несколько полей в системную таблицу sysusers?" лучше спросить "Как мне хранить дополнительную информацию, привязанную к пользователю бд? Можно ли для этого использовать системную таблицу sysusers?"

///////

10. Этот форум добровольный. Никто не обязан здесь Вам ничем. Все ответы даются добровольно. Подначивания типа: "ну что видать нет тут никаких профи" и "а вот слабо вам гуры" не приветствуются. Жалобы вида "я бедный студент, завтра зачет, а ничего не готово" и "ну что вам лень что ли написать полный запрос" - тоже. Основная цель форума - дать Вам рекомендации как Вам решить Вашу проблему. Никто не обязан делать Вашу работу за Вас.
17 май 13, 15:28    [14312522]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Я могу только пример привести) не уверен на сколько это то. Таблицы не я делал, они были...

2 таблица и ее результат
SELECT * FROM FA.ROSOwnersInterval('01.01.2000', GETDATE(), -1) where carnumber = 50024280
db de carnumber
2013-01-21 18:00:00.000 2013-02-11 18:00:00.000 50024280
2013-02-11 18:00:00.000 2013-03-06 18:00:01.000 50024280
2013-03-06 18:00:01.000 2013-04-23 18:00:00.000 50024280
2013-04-23 18:00:00.000 2013-05-20 09:32:23.617 50024280

3 таблица и ее результат
select * from R_OS_OWNERS where ID_OS = 50024280
ID_OS Data Is_Actual
50024280 2013-01-21 18:00:00.000 1
50024280 2013-02-11 18:00:00.000 0
50024280 2013-03-06 18:00:01.000 1
50024280 2013-04-23 18:00:00.000 0

Мой запрос! И вот здесь в условии надо дописать, Что если SenDate находится в промежутке который IS_Actual = 1, тогда показываем, иначе нет. Я привел пример на 1 carnumber.
with cte as
( select CarNumber, SendDate, ReceiveDate, ExpCode, InvNumber, OutInfo, IDSourceSt, IDDestSt, ForeignSourceStCode, ForeignDestStCode, Q1.CodeGroup scg, Q2.CodeGroup dcg,
row_number() over(partition by CarNumber order by SendDate) as rownum
from dl
inner join qStation q1 on IDSourceSt = q1.ID
inner join qStation q2 on IDDestSt = q2 .ID
where SendDate between '20130101'and '20130403'
and ExpCode <> '2222222'
and ExpCode <> '88888888'
and CarNumber <> 0

and Carnumber = 50024280
)
select c1.InvNumber, c2.InvNumber, c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt, c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.scg,c2.IDDestSt as Prev_IDDestSt,c2.dcg as Prev_GroupCode,ISNull(c1.ForeignSourceStCode,c1.IDSourceSt),ISNULL(c1.ForeignDestStCode,c1.IDDestSt)
from cte c1
inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1
where c1.ForeignSourceStCode IS Null and c1.ForeignDestStCode IS Null and c2.IDDestSt <> c1.IDSourceSt and c2.dcg <> c1.scg

or c1.ForeignSourceStCode IS Not Null and c1.ForeignDestStCode IS Not Null and c2.ForeignDestStCode <> c1.ForeignSourceStCode and c2.dcg <> c1.scg

order by c1.CarNumber

Результат моего запроса
CarNumber SendDate
50024280 2013-03-05 15:53:00.000
20 май 13, 09:48    [14319281]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
iap
Member

Откуда: Москва
Сообщений: 47099
PavelAA
Я могу только пример привести) не уверен на сколько это то. Таблицы не я делал, они были...
Не могу понять, что мешает получить текст запроса создания таблицы
в Management Studio и скопипастить его сюда?
20 май 13, 09:51    [14319296]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
iap
PavelAA
Я могу только пример привести) не уверен на сколько это то. Таблицы не я делал, они были...
Не могу понять, что мешает получить текст запроса создания таблицы
в Management Studio и скопипастить его сюда?


Подскажите пожалуйста как мне посмотреть SQL код уже созданной на сервере таблицы.
20 май 13, 10:14    [14319417]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Гость333
Member

Откуда:
Сообщений: 3683
PavelAA
как мне посмотреть SQL код уже созданной на сервере таблицы.

В Management Studio в дереве объектов находите нужную таблицу — правый тапок — Script Table as — CREATE To.
20 май 13, 10:25    [14319480]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Гость333
PavelAA
как мне посмотреть SQL код уже созданной на сервере таблицы.

В Management Studio в дереве объектов находите нужную таблицу — правый тапок — Script Table as — CREATE To.


Спасибо)

Что касается таблиц тут дохрена кода, не думаю что это поможет :( Я вроде написал примерчик( Простите, если не по правилам(
20 май 13, 10:32    [14319514]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Прописал вот так

select  * from R_OS_OWNERS 
inner join FA.ROSOwnersInterval('01.01.2000', GETDATE(), -1) on carnumber = ID_OS
where  IS_ACTUAL = 1 and ID_OS = 54619283 and DATA between db and de


Вроде отбирает промежутки, как теперь связать с моим запросом, ведь может быть актуально 2,3 и более строк.
20 май 13, 14:11    [14321183]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Не, не правильно(((
20 май 13, 14:29    [14321300]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Ребят, вопрос актуален, сегодня последний день :( Помогите пожалуйста(((
21 май 13, 09:15    [14324402]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
PavelAA
Гость333
пропущено...

В Management Studio в дереве объектов находите нужную таблицу — правый тапок — Script Table as — CREATE To.



Что касается таблиц тут дохрена кода, не думаю что это поможет :( Я вроде написал примерчик( Простите, если не по правилам(


Павел, если вы хотите помощи, то сделайте, что вас просят. Уже 2 человека попросили предоставить код создания таблиц, а вы всё шифруетесь... Поможет, не поможет - это уже наша проблема. Раз просят люди, значит не просто так. Не хотите, не надо. Просто потом не обижайтесь, что всем помогли, а Вам не смогли.

P.S. Извините за грубость, но правда это уже ни в какие ворота не лезет!
21 май 13, 09:29    [14324454]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Glory
Member

Откуда:
Сообщений: 104751
PavelAA
Ребят, вопрос актуален, сегодня последний день :( Помогите пожалуйста(((

Ну вы приемщикам тоже покажите скриншоты. Они же не глупые люди, поймут наверное, что там откуда надо смотреть.
21 май 13, 09:32    [14324460]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Сергей Викт.
PavelAA
пропущено...



Что касается таблиц тут дохрена кода, не думаю что это поможет :( Я вроде написал примерчик( Простите, если не по правилам(


Павел, если вы хотите помощи, то сделайте, что вас просят. Уже 2 человека попросили предоставить код создания таблиц, а вы всё шифруетесь... Поможет, не поможет - это уже наша проблема. Раз просят люди, значит не просто так. Не хотите, не надо. Просто потом не обижайтесь, что всем помогли, а Вам не смогли.

P.S. Извините за грубость, но правда это уже ни в какие ворота не лезет!


CREATE TABLE [dbo].[R_OS_OWNERS](
	[AID] [int] IDENTITY(1,1) NOT NULL,
	[ID_OS] [int] NOT NULL,
	[ID_DOCUMENT] [int] NOT NULL,
	[DATA] [datetime] NOT NULL,
	[ID_OWNER] [int] NOT NULL,
	[ID_BELONG] [int] NOT NULL,
	[ID_MANAGER] [int] NULL,
	[IS_ACTUAL] [int] NULL,
	[ID_ROW] [int] NULL,
	[ID_AGR] [int] NULL,
	[CarTypeId] [int] NULL,
	[ISVSP] [int] NULL,
 CONSTRAINT [PK_R_OS_OWNERS] PRIMARY KEY CLUSTERED 
(
	[AID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [IX_R_OS_OWNERS] UNIQUE NONCLUSTERED 
(
	[ID_DOCUMENT] ASC,
	[ID_ROW] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
21 май 13, 09:46    [14324521]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
PavelAA, первый шаг сделан)
FA.ROSOwnersInterval

Код можно посмотреть?:)
21 май 13, 09:58    [14324589]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Сергей Викт., а вообще, Павел, посмотрите на свой пост, где вы изначально описали задау:
Как сравнить две колонки с условием

там и поля таблиц другие и всё. Либо опишите ПОЛНОСТЬЮ задачу, какие есть таблицы, скрипты их создания, несколько строк с данные и то, что вы хотите получить на выходе. А то получается: мне нужно купить 2 банана, но машина едет быстро на восток....
21 май 13, 10:04    [14324636]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Сергей Викт.
PavelAA, первый шаг сделан)
FA.ROSOwnersInterval

Код можно посмотреть?:)



К сожалению я не знаю как, в таблицах нет такой, в зависимостях нашел...

К сообщению приложен файл. Размер - 41Kb
21 май 13, 10:05    [14324644]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
PavelAA
Сергей Викт.
PavelAA, первый шаг сделан)
FA.ROSOwnersInterval

Код можно посмотреть?:)



К сожалению я не знаю как, в таблицах нет такой, в зависимостях нашел...


Видимо, это табличная функция. Посмотрите, пожалуйста, в функциях
21 май 13, 10:06    [14324651]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Сергей Викт.
Сергей Викт., а вообще, Павел, посмотрите на свой пост, где вы изначально описали задау:
Как сравнить две колонки с условием

там и поля таблиц другие и всё. Либо опишите ПОЛНОСТЬЮ задачу, какие есть таблицы, скрипты их создания, несколько строк с данные и то, что вы хотите получить на выходе. А то получается: мне нужно купить 2 банана, но машина едет быстро на восток....


Ну на первой картинке я результат запроса показал)
На второй уже таблицу R_OS_OWNERS, просто вывел только нужные колонки, относительно третей я написал выше.
21 май 13, 10:07    [14324660]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
PavelAA
Сергей Викт.
PavelAA, первый шаг сделан)
FA.ROSOwnersInterval

Код можно посмотреть?:)



К сожалению я не знаю как, в таблицах нет такой, в зависимостях нашел...


Посмотрите в функциях и также, правым тапком, script as -> CREATE...
21 май 13, 10:13    [14324718]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
у меня гребанная русская версия =( Не могу в ней ниче найти!

К сообщению приложен файл. Размер - 48Kb
21 май 13, 10:54    [14325032]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
PavelAA, открываете базу данных - программирование - функции - находите вашу - правая кнопка мышки - создать скрипт для функции - создание

P.S. Приблизительно так
21 май 13, 10:59    [14325071]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Видимо я полный нуб! Вот здесь я смотрел создание, больше негде! Все облазил!

К сообщению приложен файл. Размер - 103Kb
21 май 13, 11:38    [14325341]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
PavelAA,

Ищите не в таблицах!

К сообщению приложен файл. Размер - 127Kb
21 май 13, 11:49    [14325432]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
воооооооооо)))
create function [FA].[ROSOwnersInterval] (@db datetime ,@de datetime,@id_os int)   
returns table        
as  
 
return
(
			select   
				ttb.db, ttb.de, ttb.id_os as carnumber, 
				ttb.id_belong BelongID,
				dBelonging.Name BelongName,
				DocumentID, NxtDocumentID,ArendatorID, ArendatorAgrID,
				/*Поле тормозное, нафига оно вам коллеги, даты достаточно?*/
				ROW_NUMBER() OVER (PARTITION BY ttb.id_os ORDER BY ttb.db) Npp      
			from (        
					select         
						case   
							when tt.db<=@db then @db        
							else  tt.db   
						end db ,        
						case   
							when isnull(tt.de,@de)>=@db then case when isnull(tt.de,@de)<=@de then isnull(tt.de,@de) else @de end         
							else  tt.de   
						end de,        
						id_os,      
						id_belong,ID_DOCUMENT DocumentID,NxtDocumentID,ArendatorID, ArendatorAgrID           
					from (        
							select         
								r1.data as db ,         
								RNxt.Data as de,
								r1.id_belong,
								r1.id_os as id_os,
								r1.aid, 
								R1.ID_DOCUMENT, 
								RNxt.ID_DOCUMENT NxtDocumentID,
								/*Об Арендаторе*/
								CASE WHEN r1.id_belong IN (2, 4, 9) THEN r1.ID_Manager END ArendatorID,
								CASE WHEN r1.id_belong IN (2, 4, 9) THEN r1.ID_AGR END ArendatorAgrID 
							from r_os_owners r1
							OUTER APPLY (select top 1 r2.data, r2.ID_DOCUMENT
							               from r_os_owners r2 where r2.data>r1.data and r2.id_os=r1.id_os order by data asc) RNxt
							where @id_os in (-1,r1.id_os)) tt) ttb
			LEFT JOIN dBelonging ON ttb.id_belong = dBelonging.ID 				      
			where
				(ttb.db >= @db and ttb.db <= @de)
				and (ttb.de >= @db and ttb.de <= @de)
				and datediff(second,ttb.db,ttb.de) > cast(isnull(dbo.getConstant('NotCalcMDLessSeconds'),'0') as int)
)		
21 май 13, 12:07    [14325642]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
PavelAA
воооооооооо)))
				/*Поле тормозное, нафига оно вам коллеги, даты достаточно?*/
				ROW_NUMBER() OVER (PARTITION BY ttb.id_os ORDER BY ttb.db) Npp      
				


)) Сильно. Сейчас попробую что-нибудь придумать.
21 май 13, 12:27    [14325856]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Сергей Викт.
PavelAA
воооооооооо)))
				/*Поле тормозное, нафига оно вам коллеги, даты достаточно?*/
				ROW_NUMBER() OVER (PARTITION BY ttb.id_os ORDER BY ttb.db) Npp      
				


)) Сильно. Сейчас попробую что-нибудь придумать.


with CTE_Pav as(
SELECT t2.ID_OS as ID_OS,t2.Data as [Data] ,t3.de as [de],t2.Is_Actual as [Is_Actual] 
FROM R_OS_OWNERS t2
INNER JOIN FA.ROSOwnersInterval('01.01.2000', GETDATE(), -1) t3
ON t2.DATA=t3.db AND t2.ID_OS=t3.carnumber 
WHERE t2.IS_ACTUAL=1
),
cte as
(  select CarNumber, SendDate, ReceiveDate, ExpCode, InvNumber, OutInfo, IDSourceSt, IDDestSt, ForeignSourceStCode, ForeignDestStCode, Q1.CodeGroup scg, Q2.CodeGroup dcg,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl 
     inner join qStation q1 on IDSourceSt = q1.ID
     inner join qStation q2 on IDDestSt = q2 .ID
   where SendDate between '20130101'and '20130403' 
     and ExpCode <> '2222222'  
        and ExpCode <> '88888888' 
        and CarNumber <> 0     
) 

select c1.InvNumber, c2.InvNumber,  c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt, c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.scg,c2.IDDestSt as Prev_IDDestSt,c2.dcg  as Prev_GroupCode,ISNull(c1.ForeignSourceStCode,c1.IDSourceSt),ISNULL(c1.ForeignDestStCode,c1.IDDestSt)
  from cte c1
    inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
    INNER JOIN CTE_PAV c3 ON c3.ID_OS=c1.CarNumber AND 
    c1.SendDate>=CTE_PAV.Data AND c1.SendDate<=CTE_PAV.de
  where   c1.ForeignSourceStCode IS Null and c1.ForeignDestStCode IS Null and  c2.IDDestSt <> c1.IDSourceSt  and c2.dcg <> c1.scg 
  or  c1.ForeignSourceStCode IS Not Null and c1.ForeignDestStCode IS Not Null and c2.ForeignDestStCode <> c1.ForeignSourceStCode and c2.dcg <> c1.scg 
order by c1.CarNumber

Попробуйте. Приблизительно так.
21 май 13, 12:48    [14326048]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
c1.SendDate>=CTE_PAV.Data AND c1.SendDate<=CTE_PAV.de

вот здесь ругается
The multi-part identifier "CTE_Pav.DATA" could not be bound.
21 май 13, 13:12    [14326326]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
with CTE_Pav as(
SELECT t2.ID_OS as ID_OS,t2.Data as [Data] ,t3.de as [de],t2.Is_Actual as [Is_Actual] 
FROM R_OS_OWNERS t2
INNER JOIN FA.ROSOwnersInterval('01.01.2000', GETDATE(), -1) t3
ON t2.DATA=t3.db AND t2.ID_OS=t3.carnumber 
WHERE t2.IS_ACTUAL=1
),
cte as
(  select CarNumber, SendDate, ReceiveDate, ExpCode, InvNumber, OutInfo, IDSourceSt, IDDestSt, ForeignSourceStCode, ForeignDestStCode, Q1.CodeGroup scg, Q2.CodeGroup dcg,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl 
     inner join qStation q1 on IDSourceSt = q1.ID
     inner join qStation q2 on IDDestSt = q2 .ID
   where SendDate between '20130101'and '20130403' 
     and ExpCode <> '2222222'  
        and ExpCode <> '88888888' 
        and CarNumber <> 0     
) 

select c1.InvNumber, c2.InvNumber,  c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt, c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.scg,c2.IDDestSt as Prev_IDDestSt,c2.dcg  as Prev_GroupCode,ISNull(c1.ForeignSourceStCode,c1.IDSourceSt),ISNULL(c1.ForeignDestStCode,c1.IDDestSt)
  from cte c1
    inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
    INNER JOIN CTE_PAV c3 ON c3.ID_OS=c1.CarNumber AND 
    c1.SendDate>=c3.Data AND c1.SendDate<=c3.de
  where   c1.ForeignSourceStCode IS Null and c1.ForeignDestStCode IS Null and  c2.IDDestSt <> c1.IDSourceSt  and c2.dcg <> c1.scg 
  or  c1.ForeignSourceStCode IS Not Null and c1.ForeignDestStCode IS Not Null and c2.ForeignDestStCode <> c1.ForeignSourceStCode and c2.dcg <> c1.scg 
order by c1.CarNumber

Ошибся.
21 май 13, 13:15    [14326344]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
157 тыс строк, дубли по carnumber... Мой запрос
with cte as
(  select CarNumber, SendDate, ReceiveDate, ExpCode, InvNumber, OutInfo, IDSourceSt, IDDestSt, ForeignSourceStCode, ForeignDestStCode, Q1.CodeGroup scg, Q2.CodeGroup dcg,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl 
     inner join qStation q1 on IDSourceSt = q1.ID
     inner join qStation q2 on IDDestSt = q2.ID
   where SendDate between '20130101'and '20130403' 
     and ExpCode <> '2222222'  
        and ExpCode <> '88888888' 
        and CarNumber <> 0 
        and OutInfo <> '0' 
        and StatusRecord = '0' 
        and (isnull(DUETYPE_ID, 0) <> 29 or ID_TRANSKIND = '2')
        and Summa > 0
	    and carnumber = 50024280

) 
select c1.InvNumber, c2.InvNumber,  c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt, c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.scg,c2.IDDestSt as Prev_IDDestSt,c2.dcg  as Prev_GroupCode,ISNull(c1.ForeignSourceStCode,c1.IDSourceSt),ISNULL(c1.ForeignDestStCode,c1.IDDestSt)
  from cte c1
    inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
  where   c1.ForeignSourceStCode IS Null and c1.ForeignDestStCode IS Null and  c2.IDDestSt <> c1.IDSourceSt  and c2.dcg <> c1.scg 
      or  c1.ForeignSourceStCode IS Not Null and c1.ForeignDestStCode IS Not Null and c2.ForeignDestStCode <> c1.ForeignSourceStCode and c2.dcg <> c1.scg 
	--  and not exists (select  * from FA.ROSOwnersInterval('01.01.2000', GETDATE(), -1) where c1.ReceiveDate <db and c2.SendDate >de )
order by c1.CarNumber


оставлял 1900 строк
21 май 13, 13:21    [14326381]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
PavelAA
157 тыс строк, дубли по carnumber... Мой запрос


оставлял 1900 строк


я щас орать начну.... Просили у Вас данные ещё на 6 странице... тестовые. Я же пишу без данных, как я могу что-либо отладить, не имея данных????? Откуда я знаю, сколько и чего вы должны получить?

Идею я вам дал, дальше, думаю, разберетесь.
А то народ совсем обленился...


Засим покидаю топик, удачи....
21 май 13, 13:24    [14326405]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Сергей Викт.
PavelAA
157 тыс строк, дубли по carnumber... Мой запрос


оставлял 1900 строк


я щас орать начну.... Просили у Вас данные ещё на 6 странице... тестовые. Я же пишу без данных, как я могу что-либо отладить, не имея данных????? Откуда я знаю, сколько и чего вы должны получить?

Идею я вам дал, дальше, думаю, разберетесь.
А то народ совсем обленился...


Засим покидаю топик, удачи....


Спасибо вам, не обижайтесь) Постараюсь разобраться, первый select верно отбирает...
21 май 13, 13:26    [14326411]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
PavelAA
Спасибо вам, не обижайтесь) Постараюсь разобраться, первый select верно отбирает...

На обиженных воду возят (с) :)

Попробуйста такой вариант:
th CTE_Pav as(
SELECT t2.ID_OS as ID_OS,t2.Data as [Data] ,t3.de as [de],t2.Is_Actual as [Is_Actual] 
FROM R_OS_OWNERS t2
INNER JOIN FA.ROSOwnersInterval('01.01.2000', GETDATE(), -1) t3
ON t2.DATA=t3.db AND t2.ID_OS=t3.carnumber 
WHERE t2.IS_ACTUAL=1
),
cte as
(  select CarNumber, SendDate, ReceiveDate, ExpCode, InvNumber, OutInfo, IDSourceSt, IDDestSt, ForeignSourceStCode, ForeignDestStCode, Q1.CodeGroup scg, Q2.CodeGroup dcg,
          row_number() over(partition by CarNumber order by SendDate) as rownum 
   from  dl 
     inner join qStation q1 on IDSourceSt = q1.ID
     inner join qStation q2 on IDDestSt = q2 .ID
   where SendDate between '20130101'and '20130403' 
     and ExpCode <> '2222222'  
        and ExpCode <> '88888888' 
        and CarNumber <> 0     
), 
CTE_new AS(
select c1.InvNumber, c2.InvNumber,  c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt, c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.scg,c2.IDDestSt as Prev_IDDestSt,c2.dcg  as Prev_GroupCode,ISNull(c1.ForeignSourceStCode,c1.IDSourceSt),ISNULL(c1.ForeignDestStCode,c1.IDDestSt)
  from cte c1
    inner join cte c2 on c2.CarNumber = c1.CarNumber and c2.rownum = c1.rownum - 1 
    
  where   c1.ForeignSourceStCode IS Null and c1.ForeignDestStCode IS Null and  c2.IDDestSt <> c1.IDSourceSt  and c2.dcg <> c1.scg 
  or  c1.ForeignSourceStCode IS Not Null and c1.ForeignDestStCode IS Not Null and c2.ForeignDestStCode <> c1.ForeignSourceStCode and c2.dcg <> c1.scg 
)
SELECT c1.InvNumber, c2.InvNumber,  c1.CarNumber, c1.SendDate, c1.ReceiveDate, c1.IDSourceSt, c1.IDDestSt, c1.OutInfo,c1.ExpCode,c1.ForeignSourceStCode,c1.ForeignDestStCode,c1.scg,c2.IDDestSt as Prev_IDDestSt,c2.dcg  as Prev_GroupCode,ISNull(c1.ForeignSourceStCode,c1.IDSourceSt),ISNULL(c1.ForeignDestStCode,c1.IDDestSt)
  from cte_new c1 INNER JOIN CTE_PAV c3 ON c3.ID_OS=c1.CarNumber AND 
    c1.SendDate>=c3.Data AND c1.SendDate<=c3.de
order by c1.CarNumber
21 май 13, 13:32    [14326451]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
PavelAA
Member

Откуда:
Сообщений: 121
Все получилось)) Еще в пером) я сам немного накосячил((( Спасибо вам огромное!!!! Простите где тупил)))
21 май 13, 13:42    [14326498]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
PavelAA
Все получилось)) Еще в пером) я сам немного накосячил((( Спасибо вам огромное!!!! Простите где тупил)))


НУ УРА!!!!!!!!!!!!! Поздравляю!!!
21 май 13, 13:43    [14326504]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Итого : с 28 марта по 21 мая - решалась задача
21 май 13, 13:45    [14326524]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить две колонки с условием  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Maxx
Итого : с 28 марта по 21 мая - решалась задача

Я только вчера заметил топик)
21 май 13, 14:00    [14326661]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3 4 5 6 7 8      [все]
Все форумы / Microsoft SQL Server Ответить