|
v7: 1SQLite: Как правильно посчитать общее количество документов? | ☑ | ||
---|---|---|---|---|
0
Zhuravlik
30.04.13
✎
11:35
|
Здравствуйте. Хочу в запросе получить общее количество документов одноо вида, и количество помеченных на удаление. Делаю так:
ТекстЗапроса = " |SELECT | COUNT(*) as [Всего], | | (SELECT COUNT(*) | FROM [Журнал] as _Жур | Where _ЖУР.ISMARK = '*' AND _Жур.iddocdef = :ВидДокумента.!ВидДок!) as [Удалено] | |From [Журнал] as Жур |WHERE Жур.iddocdef = :ВидДокумента.!ВидДок! |"; Смущает селект в селекте, а как по-другому не пойму. Это ведь неправильно так делать? Или все верно? |
|||
1
toypaul
гуру
30.04.13
✎
11:39
|
select count(), count(case when условие then 1 else 0 end) from t
так можно в 1SQLite? |
|||
2
Zhuravlik
30.04.13
✎
11:40
|
(1) Не знаю, но думаю попробовать стоит :) Ушел копать функцию "Case"...
|
|||
3
orefkov
30.04.13
✎
11:42
|
(1)
Только наверное второй не count, а sum |
|||
4
toypaul
гуру
30.04.13
✎
11:43
|
(3) ага
|
|||
5
Zhuravlik
30.04.13
✎
11:49
|
Спасибо! Все получилось:
ТекстЗапроса = " |SELECT | COUNT(*) as [Всего], | | SUM(CASE WHEN Жур.ISMARK = '*' THEN 1 ELSE 0 END) as [Удалено] | |From [Журнал] as Жур |WHERE Жур.iddocdef = :ВидДокумента.!ВидДок! |"; |
|||
6
Zhuravlik
30.04.13
✎
12:15
|
А скажите, если у документа нет реквизитов табличной части, запрос будет ошибку выдавать на
INNER JOIN [ДокументСтроки.!ВидДок!] as ДокТЧ ? И если будет, как ее обойти? |
|||
7
Ёпрст
30.04.13
✎
12:19
|
не делать inner join с несуществующей таблицей не предлагать ?
|
|||
8
Zhuravlik
30.04.13
✎
12:20
|
(7) А как ее на существование проверить в запросе?
|
|||
9
Zhuravlik
30.04.13
✎
12:22
|
+ Или только из метаданных это узнавать, и по результату добавлять-не добавлять иннер джойн в текст запроса?
|
|||
10
Ёпрст
30.04.13
✎
12:26
|
проверить, что возвращает запрос
select name from sqlite_master where name='имятаблички' а так, нафига скармливать изначально неверный текст запроса ? |
|||
11
Zhuravlik
30.04.13
✎
12:36
|
(10) Плата за универсальность. И просто понять для развития...
А прикрутить с exists? т.е. CASE WHEN exists(select name from sqlite_master where name='!ВидДок!') THEN INNER JOIN [ДокументСтроки.!ВидДок!] as ДокТЧ END Так? А как тогда в селекте обращаться? Если я хочу узнать COUNT(ДокТЧ.LINENO)? |
|||
12
Ёпрст
30.04.13
✎
12:38
|
(11) так не выйдет
|
|||
13
Ёпрст
30.04.13
✎
12:40
|
можно разве что создать табличку ежели её нет..будет просто пустая
|
|||
14
Туц
30.04.13
✎
14:38
|
Тоже мне проблема.
ПустойДок = ПолучитьПустоеЗначение("Документ.ПоступлениеТМЦРозница"); глБДЗапрос.УстановитьТекстовыйПараметр("ВыбТип", ПустойДок); Рез = глБДЗапрос.ВыполнитьИнструкцию(" |SELECT COUNT(*) Всего |,SUM(CASE WHEN Журнал.ISMARK = 1 THEN 1 ELSE 0 END) Помечено |,(selecT count(*) FROM $ДокументСтроки."+ПустойДок.Вид()+") ВсегоСтрок |FROM _1SJOURN Журнал |WHERE Журнал.IDDOCDEF = :ВыбТип~~~ |"); Рез.ВыбратьСтроку(); Но это 1с++ На sqlite похоже будет. |
|||
15
Zhuravlik
30.04.13
✎
14:50
|
(14) Тут проблема в другом. 1С (в ДБФ) не создает таблицы для шапок (DH) если нет реквизитов шапки, и не создает таблиц для табличных частей (DT) если нет реквизитов табличной части. И если я в запросе к таблице строк обращусь (для документа у которого нет реквизитов табличной части), то запрос ругнется, что нет такой таблицы.
Сейчас через метаданные смотрю, есть ли реквизиты, если есть - опрашиваю таблицу. Было-бы интересно узнать как это обойти именно в запросе. Видимо только как в (10), и создавать временную пустую если не существует записей в "sqlite_master". |
|||
16
Туц
01.05.13
✎
06:00
|
(15) да какие проблемы
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'["+ИмяТаблицы+"]') AND type in (N'U')) SELECT 1 ESLE SELECT 0 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |