|
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", а один человек - базу ТТН. (работают в разное время, т.е. одновременно двух пользователей нет) Сижу вот, думаю - может было бы лучше все это в одной таблице иметь?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |