Имя: Пароль:
1C
1С v8
Соединение по первой строке в запросе
0 MaiorovYury
 
19.06.13
10:04
Подскажите, как сделать соединение двух таблиц, только чтобы выбиралась только первая строка из второй таблицы
Что-то вроде этого
ВЫБРАТЬ * ИЗ ВТДаты
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ * ИЗ ВТСостояния УПОРЯДОЧИТЬ ПО Период) ПО ВТСостояния.Период>=ВТДаты.ДатаКалендаря И Количество(ВТСостояния.Период)=1
1 vicof
 
19.06.13
10:06
из второй таблицы нужно выбирать первые 1
2 MaiorovYury
 
19.06.13
10:09
(1) а как там условие вписать что Период>=ВТДаты.ДатаКалендаря
3 vicof
 
19.06.13
10:11
(2) какая изначально задача стоит?
4 MaiorovYury
 
19.06.13
10:20
Есть таблица с рабочими датами (ВТДаты)
01.05.13
02.05.13
05.05.13
06.05.13
07.05.13

Есть таблица с состояниями работников (ВТСостояния) в таком виде
01.05.13 Работает
05.05.13 Болеет
07.05.13 Работает

Надо их объединить
01.05.13 Работает
02.05.13 Работает
05.05.13 Болеет
06.05.13 Болеет
07.05.13 Работает
5 vicof
 
19.06.13
10:23
(4) не взлетит
6 MaiorovYury
 
19.06.13
10:23
Может можно сначала объединить ВТСостояния чтобы получить
01.05.13 Работает 05.05.13 Более
05.05.13 Болеет 07.05.13 Работает
07.05.13 Работает

?
Правда я так понимаю это та же задача
7 vicof
 
19.06.13
10:23
(5) Какая задача стоит еще первичней?
8 MaiorovYury
 
19.06.13
10:23
(5) то есть через запрос невозможно?
9 Ёпрст
 
гуру
19.06.13
10:24
(0) и зачем тут первая строка ?

Тупо левое соедиение, даты с таблички дат, состояние - с таблички состояний и привет, условие соединенеия знак меньши или равно по дате. Всё.
10 Ёпрст
 
гуру
19.06.13
10:24
(6) не надо.
11 Ненавижу 1С
 
гуру
19.06.13
10:24
(8) почему нет? возможно
12 vicof
 
19.06.13
10:25
(6) вообще у регистра состояний есть ресурс СостояниеЗавершения
13 Smallrat
 
19.06.13
10:25
(8) можно, если я правильно понял что имеется ввиду
делаешь второй запрос с группировкой по максимум(период), а потом соединяешь с ним же по максимум(период) = Период и получаешь одну запись.
14 MaiorovYury
 
19.06.13
10:26
(12) Да только он не всегда заполнен
15 vicof
 
19.06.13
10:32
(14) Его обрабатывать надо
http://infostart.ru/public/102648/ лови
16 MaiorovYury
 
19.06.13
10:35
(13) получилось сгруппировать с максимальным периодом
Наворочено получается конечно, но хоть как-то)))
Спасибо!
17 MaiorovYury
 
19.06.13
10:36
(15) и за ссылочку спасибо!
Читаю)))
18 Ненавижу 1С
 
гуру
19.06.13
10:40
можно таблицу состояний соединить саму с собой и получить периоды действия, а потом таблицу дат соединить с таблицей периодов
19 MaiorovYury
 
19.06.13
12:03
(18) а как состояния то соединить саму с собой?
Там же тоже надо по одной строке выбирать. То же самое что я в самом начале писал.
20 Ненавижу 1С
 
гуру
19.06.13
12:19
(19) а вот так:
выбрыть ВТСостояния1.Дата, ВТСостояния1.Состояние, ЕСТЬNULL(МИНИМУМ(ВТСостояния1.Дата),ДАТАВРЕМЯ(2100,1,1)) КАК Конец
ИЗ ВТСостояния как ВТСостояния1
ЛЕВОЕ СОЕДИНЕНИЕ ВТСостояния КАК ВТСостояния2
ПО ВТСостояния1.Дата<=ВТСостояния2.Дата
СГРУППИРОВАТЬ ПО ВТСостояния1.Дата, ВТСостояния1.Состояние
21 MaiorovYury
 
19.06.13
12:32
(20)
Там где МИНИМУМ должно быть ВТСОстояния2, а не 1
Это если кому-то еще понадобится.
И имхо это самый крутой вариант!
Спасибо!
22 Ненавижу 1С
 
гуру
19.06.13
12:41
(21) да, я ошибся
23 zak555
 
19.06.13
14:30
(9) может больше или равно ?
24 zak555
 
19.06.13
14:43
(20) есть нулл зачем ?
25 MaiorovYury
 
19.06.13
14:56
(24) есть нулл я не использовал - мне все равно что там в последней строке будет
26 zak555
 
20.06.13
15:16
(4)

ВЫБРАТЬ
   ВТДаты.Поле1,
   ВТСостояние.Поле2 КАК Статус,
   РАЗНОСТЬДАТ(ВТСостояние.Поле1, ВТДаты.Поле1, ДЕНЬ) КАК КолДней
ПОМЕСТИТЬ ВТ
ИЗ
   ВТДаты КАК ВТДаты
       ЛЕВОЕ СОЕДИНЕНИЕ ВТСостояние КАК ВТСостояние
       ПО ВТДаты.Поле1 >= ВТСостояние.Поле1

СГРУППИРОВАТЬ ПО
   ВТДаты.Поле1,
   ВТСостояние.Поле1,
   ВТСостояние.Поле2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВТ.Поле1,
   ВТ.Статус
ИЗ
   ВТ КАК ВТ
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           ВТ.Поле1 КАК Поле1,
           МИНИМУМ(ВТ.КолДней) КАК КолДней
       ИЗ
           ВТ КАК ВТ
       
       СГРУППИРОВАТЬ ПО
           ВТ.Поле1) КАК вложенныйЗапрос
       ПО ВТ.Поле1 = вложенныйЗапрос.Поле1
           И ВТ.КолДней = вложенныйЗапрос.КолДней

СГРУППИРОВАТЬ ПО
   ВТ.Поле1,
   ВТ.Статус
27 Ненавижу 1С
 
гуру
20.06.13
15:31
(24) чтобы корректно потом сравнивать на вхождение в интервал
28 zak555
 
20.06.13
18:30
(27) тогда чем твоё (20) отличается от ?

ВЫБРАТЬ
    ВТСостояние.Поле1,
    ВТСостояние.Поле2,
    ВТСостояние.Поле1 КАК Конец
ИЗ ВТСостояние
29 Serginio1
 
20.06.13
19:06
30 Serginio1
 
20.06.13
19:07
29+ тьфу 228
31 zak555
 
20.06.13
19:13
и что это даёт ?
32 Ненавижу 1С
 
гуру
20.06.13
19:29
(28) там доложно быть строгое неравенство, ошибся, бывает
33 zak555
 
20.06.13
19:34
(32) тоже самое
34 Ненавижу 1С
 
гуру
20.06.13
19:37
35 zak555
 
20.06.13
19:42
(34) так ты сам проверь
36 Ненавижу 1С
 
гуру
20.06.13
19:46
(35) так пишу же - работает нах
37 zak555
 
20.06.13
19:47
(36) вот это ?

выбрать ВТСостояния1.Поле1, ВТСостояния1.Поле2, ЕСТЬNULL(МИНИМУМ(ВТСостояния1.Поле1),ДАТАВРЕМЯ(2100,1,1)) КАК Конец
ИЗ ВТСостояние как ВТСостояния1
ЛЕВОЕ СОЕДИНЕНИЕ ВТСостояние КАК ВТСостояния2
ПО ВТСостояния1.Поле1<>ВТСостояния2.Поле1
СГРУППИРОВАТЬ ПО ВТСостояния1.Поле1, ВТСостояния1.Поле2


и оно соответствует (4) ?
38 EvgeniuXP
 
20.06.13
20:54
(0) 4-ый модуль - зарплата, Гилев - там решения есть.
39 Ненавижу 1С
 
гуру
20.06.13
20:56
(37) перестал ты, читай сначала все
40 zak555
 
21.06.13
09:52
(39) ???
41 Ненавижу 1С
 
гуру
21.06.13
10:18
42 zak555
 
21.06.13
10:19
(41) это я смотрел, но (37) не работает по условию (4)