Имя: Пароль:
1C
1C 7.7
v7: 1SQLite: Помогите с запросом?
,
0 Zhuravlik
 
08.02.13
18:33
Добрый вечер. Есть внешняя база на SQLite, вот ее структура:


           Запрос = г_ТТН_база.НовыйЗапрос();

           //Таблица хранит в себе сведения о выписанных ТТН по маршруту
           //(по одной строке документа).
           ТекстЗапроса = "
           |CREATE  TABLE  IF NOT EXISTS 'TTN'
           |    (
           |        /* Ключевые поля */
           |        'ID_ttn'    INTEGER PRIMARY KEY,
           |        'ID_str'    INTEGER NOT NULL,
           |        'ID_dok'    INTEGER NOT NULL,
           |
           |        /* Номер и дата ТТН */
           |        'НомерТТН'        TEXT,
           |        'ДатаТТН'        TEXT,
           |
           |        /* Количество перевозимых машин в поставке */
           |        'Кол_АМ'        INTEGER
           |
           |    )";            
       
           Запрос.ВыполнитьЗапрос(ТекстЗапроса);
           
           
           //Таблица описывает соттветствие Маршрут-Автовоз- пакет ТТН, по строкам документа
           ТекстЗапроса = "
           |CREATE  TABLE  IF NOT EXISTS 'PEREVOZKI'
           |    (
           |        /* Ключевые поля */
           |        'ID_str'    INTEGER PRIMARY KEY,
           |        'ID_dok'    INTEGER NOT NULL,
           |
           |        /* Номер строки табличной части в док. Реализации и заявки */
           |        'СтрокаДокумента'    TEXT,
           |
           |        /* Дата создания записи */
           |        'ДатаСоздания'        TEXT,
           |
           |        /* Дата внесения пользователем последних изменений */
           |        'ДатаРед'            TEXT,
           |
           |        /* Статус рейса (прямой/обратный) */
           |        'Статус'            TEXT,
           |
           |        /* Справочник.АВТ_ТранспортныеСредства */
           |        'Автовоз'        TEXT,
           |
           |        /* Справочник 'Сотрудники', водитель рейса */
           |        'СПР_С_Ссылка'        TEXT,
           |        'СПР_С_Код'            TEXT,
           |        'СПР_С_Имя'            TEXT,
           |
           |        /* Справочник.АВТ_Маршрут */
           |        'СПР_М_Ссылка'        TEXT,
           |        'СПР_М_Код'        TEXT,
           |        'СПР_М_Имя'            TEXT,
           |
           |        /* Документ.АВТ_ПутевойЛист */
           |        'ДОК_П_Ссылка'        TEXT,
           |        'ДОК_П_Номер'        TEXT,
           |        'ДОК_П_Дата'        TEXT,
           |
           |        /* Даты начала-конца рейса */
           |        'ДатаУбытия'        TEXT,
           |        'ДатаПрибытия'        TEXT,
           |
           |        /* Задолженность плательщика за рейс */
           |        'Сумма'                INTEGER,
           |
           |        /* Километраж ТТН */
           |        'Километраж'        INTEGER
           |
           |    )";                

           Запрос.ВыполнитьЗапрос(ТекстЗапроса);

           
           //Таблица хранит ссылки на агрегаты, а также номера, даты и наименования
           //в строковом формате. На случай сбоя базы, если ссылка на документ изменится.
           ТекстЗапроса = "
           |CREATE  TABLE  IF NOT EXISTS 'DOC_LINK'
           |    (
           |
           |        /* Ключевое поле */
           |        'ID_dok'    INTEGER PRIMARY KEY,
           |
           |        /* Флаг запрета редактирования */
           |        'флЗапретРедактирования'    INTEGER,
           |
           |        /* Документ._ТТН_Реализация */
           |        'ДОК_Р_Ссылка'        TEXT,
           |        'ДОК_Р_Номер'        TEXT,
           |        'ДОК_Р_Дата'        TEXT,
           |        
           |        /* Документ._ТТН_Заявка */
           |        'ДОК_З_Ссылка'        TEXT,
           |        'ДОК_З_Номер'        TEXT,
           |        'ДОК_З_Дата'        TEXT,
           |
           |        /* Справочник.Контрагенты */
           |        'СПР_К_Ссылка'        TEXT,
           |        'СПР_К_Код'            TEXT,
           |        'СПР_К_Имя'            TEXT,
           |
           |        /* Справочник.Договоры */
           |        'СПР_Д_Ссылка'        TEXT,
           |        'СПР_Д_Код'            TEXT,
           |        'СПР_Д_Имя'            TEXT
           |
           |    )";        

           Запрос.ВыполнитьЗапрос(ТекстЗапроса);


Мне необходимо получить все данные таблицы "PEREVOZKI", и к ней присобачить из таблицы "DOC_LINK" графу заказчик, а из таблицы TTN - Итог по Кол_АМ, и Количество записей по Кол_АМ (в группировке по PEREVOZKI). Делаю так:

   ОсновнойЗапрос = г_ТТН_база.НовыйЗапрос();
   ТекстЗапроса = "
   |SELECT
   |    Ссылки.СПР_К_Имя    as [Заказчик],
   |    Рейсы.ID_str        as [ID_str],
   |    Рейсы.Автовоз        as [Автовоз],
   |    Рейсы.СПР_С_Ссылка    as [Водитель $Справочник.Сотрудники],
   |    Рейсы.СПР_М_Ссылка    as [Маршрут $Справочник.АВТ_Маршрут],
   |    Рейсы.ДОК_П_Номер    as [НомерПЛ],
   |    Рейсы.ДОК_П_Дата    as [ДатаПЛ $Дата],
   |    Рейсы.ДатаУбытия    as [ДатаУбытия $Дата],
   |    Рейсы.ДатаПрибытия    as [ДатаПрибытия $Дата],
   |    Рейсы.Сумма            as [Сумма],
   |    Рейсы.Километраж    as [Километраж],
   |    SUM(ТТН.Кол_АМ)        as [Кол_АМ],
   |    COUNT(ТТН.Кол_АМ)    as [Кол_ТТН]
   |FROM
   |    PEREVOZKI as [Рейсы]
   |
   |LEFT JOIN TTN as [ТТН] on ТТН.ID_str = Рейсы.ID_str
   |LEFT JOIN DOC_LINK as [Ссылки] on Ссылки.ID_dok = Рейсы.ID_dok
   |
   |WHERE
   |    "+ ДатаРежим +" between @НачДата AND @КонДата
   |";



- он мне выводит только одну строчку. А я уже  и не пойму что тут делать Group By что-ли...
1 Zhuravlik
 
08.02.13
18:35
+ Извиняюсь,

   ОсновнойЗапрос = г_ТТН_база.НовыйЗапрос();
   ТекстЗапроса = "
   |SELECT
   |    Ссылки.СПР_К_Имя    as [Заказчик],
   |    Рейсы.ID_str        as [ID_str],
   |    Рейсы.Автовоз        as [Автовоз],
   |    Рейсы.СПР_С_Ссылка    as [Водитель $Справочник.Сотрудники],
   |    Рейсы.СПР_М_Ссылка    as [Маршрут $Справочник.АВТ_Маршрут],
   |    Рейсы.ДОК_П_Номер    as [НомерПЛ],
   |    Рейсы.ДОК_П_Дата    as [ДатаПЛ $Дата],
   |    Рейсы.ДатаУбытия    as [ДатаУбытия $Дата],
   |    Рейсы.ДатаПрибытия    as [ДатаПрибытия $Дата],
   |    Рейсы.Сумма            as [Сумма],
   |    Рейсы.Километраж    as [Километраж],
   |    SUM(ТТН.Кол_АМ)        as [Кол_АМ],
   |    COUNT(ТТН.Кол_АМ)    as [Кол_ТТН]
   |FROM
   |    PEREVOZKI as [Рейсы]
   |
   |LEFT JOIN TTN as [ТТН] on ТТН.ID_str = Рейсы.ID_str
   |LEFT JOIN DOC_LINK as [Ссылки] on Ссылки.ID_dok = Рейсы.ID_dok
   |
   |WHERE
   |    ТТН.ДатаТТН between @НачДата AND @КонДата
   |";
2 Zhuravlik
 
08.02.13
18:36
(0) Опять опечатался, не графу заказчик, а поле "СПР_К_Имя"
3 viktor_vv
 
08.02.13
18:45
По идее должен был ругнуться, раз без Group by, по крайней мере MS точно ругнулся бы.
4 viktor_vv
 
08.02.13
18:46
Добавь group by по полям без функций.
5 viktor_vv
 
08.02.13
18:49
И количество ТТН лучше считать по ID
COUNT(Distinct ТТН.ID_str)
6 КонецЦикла
 
08.02.13
18:52
Лучше вообще для итоговых полей завести отдельные поля в отдельной таблице
По сабжу: не проникся структурой, пробуй последовательно, добавляя соединения и условия, авось допрешь
7 Zhuravlik
 
08.02.13
18:52
(4) Оно)
(5) А где его считать? HAVING?
8 Zhuravlik
 
08.02.13
18:53
(6) Ды вот тыркался-тыркался, подумал может миста спасет меня)
9 viktor_vv
 
08.02.13
18:54
(7) Вместо твоего COUNT(ТТН.Кол_АМ)
Опять же не совсем понятна структура таблиц.
Совет из предположения, что на одну запись в Perevozki будет несколько записей из TTN.
10 orefkov
 
08.02.13
18:55
Конечно group by тогда нужен.
11 Zhuravlik
 
08.02.13
18:56
Засиделся, автобус рабочий уезжает уже, я позже выйду, ладно?
12 viktor_vv
 
08.02.13
18:57
(11) Разрешаем :).
13 КонецЦикла
 
08.02.13
18:57
(11) какой автобус? нужно добить сабж! :)
14 Zhuravlik
 
08.02.13
22:09
(9) Так и есть, на одну запись из перевозок будет несколько записей из ТТН.
Взял с собой базу рабочую, сейчас буду дотыркивать. Спасибо всем за советы)
15 Zhuravlik
 
08.02.13
22:23
А скажите, если говорить о структуре а не о занимаемом месте, кому как было бы проще работать с такой базой: хранить ее в отдельной ОДНОЙ таблице, или вот так, как есть?
16 Zhuravlik
 
08.02.13
22:25
Я так сделал из соображений удобства, дело в том что два человека будут забивать базу "PEREVOZKI", а один человек - базу ТТН. (работают в разное время, т.е. одновременно двух пользователей нет) Сижу вот, думаю - может было бы лучше все это в одной таблице иметь?