|
Сумма в SQL | ☑ | ||
|---|---|---|---|---|
|
0
Anatolik
03.03.09
✎
13:19
|
как проссумировать по отдельности все отрицательнае и положительные значения?
|
|||
|
1
Нуф-Нуф
03.03.09
✎
13:20
|
сум >0
сум <0 |
|||
|
2
ДенисЧ
03.03.09
✎
13:20
|
SUM(CASE WHEN S>0 THEN S ELSE 0) AS PlusSum
|
|||
|
3
Anatolik
03.03.09
✎
13:25
|
(2) СПАСИБО!
теперь я думаю все сойдется =) |
|||
|
4
ДенисЧ
03.03.09
✎
13:25
|
(3) Воруете? :-)
|
|||
|
5
Anatolik
03.03.09
✎
13:26
|
(4) нет подсматриваю за 1с =)
|
|||
|
6
Anatolik
03.03.09
✎
14:22
|
просто несовсем понятно как приход / расход за период определяется
|
|||
|
7
ДенисЧ
03.03.09
✎
14:25
|
приход-расход в регистре определяется по полю debkred
|
|||
|
8
Sadovnikov
03.03.09
✎
14:25
|
(6) Это?
ТекстЗапроса = " | Select | Регистр.Документ КредДок, | Регистр.Контрагент Контрагент, | '' ДокДвижения, | Регистр.Сумма НачОстаток, | Cast(0 As Numeric(19, 5)) УвеличениеДолга, | Cast(0 As Numeric(19, 5)) УменьшениеДолга | From | регВзаиморасчетыИтоги Регистр | Where | Регистр.Period = @ДатаИтогов | And Регистр.Сумма <> 0" + стрВидыКредДоков; Если фИтогиАктуальны = 0 Тогда ТекстЗапроса = ТекстЗапроса + " | | Union All | | Select | Регистр.Документ КредДок, | Регистр.Контрагент Контрагент, | '' ДокДвижения, | (Case When Регистр.DebKred = 0 Then Регистр.Сумма Else -Регистр.Сумма End) НачОстаток, | Cast(0 As Numeric(19, 5)) УвеличениеДолга, | Cast(0 As Numeric(19, 5)) УменьшениеДолга | From | регВзаиморасчеты Регистр (NoLock) | Where | Регистр.Date_Time_IDDOC > @Остатки_НачДатаДвижений And Регистр.Date_Time_IDDOC < @Остатки_КонДатаДвижений | And Регистр.Сумма <> 0" + стрВидыКредДоков; КонецЕсли; |
|||
|
9
Anatolik
03.03.09
✎
14:44
|
как в этом запросе разбить колонку сумма на приход и расход
Select SP4322 фирма, SP4323 договор, SP4329 сумма from ( Select RA.SP4322, RA.SP4323, SP4329=CASE DEBKRED WHEN 0 THEN RA.SP4329 ELSE -RA.SP4329 END from RA4335 RA(NOLOCK) where RA.DATE_TIME_IDDOC>='20081007 0 0 ' and RA.DATE_TIME_IDDOC<'20081016 0 0 ' ) AS Tmp GROUP BY SP4322, SP4323, SP4329 |
|||
|
10
ДенисЧ
03.03.09
✎
14:48
|
select ...
CASE debkred WHEN 0 WHEN SP4329 ELSE 0 END AS Приход, CASE debkred WHEN 1 WHEN SP4329 ELSE 0 END AS Расход |
|||
|
11
ДенисЧ
03.03.09
✎
14:49
|
select ...
CASE debkred WHEN 0 THEN SP4329 ELSE 0 END AS Приход, CASE debkred WHEN 1 THEN SP4329 ELSE 0 END AS Расход так точнее |
|||
|
12
Anatolik
03.03.09
✎
14:56
|
(10)(11) еще раз спасибо =)
|
|||
|
13
Anatolik
03.03.09
✎
14:59
|
теперь с начальными остатками буду объединять
|
|||
|
14
Anatolik
03.03.09
✎
16:50
|
вообшем не получается объеденить эти два запроса =(
/* Общие расчеты с контрагентами. Начальнае остатки */ Select SC172.DESCR Контрагент, SC204.DESCR договор, SC4014.DESCR Фирма, НачОст=SUM(SP4329) from ( ..... ) AS Tmp, SC204, SC172, SC4014 Where SC204.ID=Tmp.SP4323 and SC172.ID=SC204.ParentExt and SC4014.ID=SP4322 and SP4329 != 0 GROUP BY SC172.DESCR, SC204.DESCR , SC4014.DESCR ORDER BY SC172.DESCR, SC204.DESCR , SC4014.DESCR /* ***************************************************************** */ /* Движения по контрагентам*/ Select SC172.DESCR Контрагент, SC204.DESCR договор, SC4014.DESCR Фирма, Приход=sum(приход), Расход=sum(расход) from ( ... ) AS Tmp, SC204, SC172, SC4014 Where SC204.ID=Tmp.Договор and SC172.ID=SC204.ParentExt and SC4014.ID=Tmp.Фирма GROUP BY SC172.DESCR, SC204.DESCR , SC4014.DESCR ORDER BY SC172.DESCR, SC204.DESCR , SC4014.DESCR |
|||
|
15
Sadovnikov
04.03.09
✎
06:50
|
Ты скажи, чего сделать-то хочешь в итоге?
|
|||
|
16
Anatolik
04.03.09
✎
09:37
|
в итоге хочу получить общие взаиморасчетами с контрагентами
вот такой стандартный отчет контрагет договор фирма НачОст Приход Расход КонОст |
|||
|
17
Sadovnikov
04.03.09
✎
09:40
|
(16) А чем код из (8) не устроил? Добавив к нему:
ТекстЗапроса = ТекстЗапроса + " | | Union All | | Select | Регистр.Документ КредДок, | Регистр.Контрагент Контрагент, | '' ДокДвижения, | Cast(0 As Numeric(19, 5)) НачОстаток, | Регистр.СуммаПриход УвеличениеДолга, | Регистр.СуммаРасход УменьшениеДолга | From | регВзаиморасчеты Регистр | Where | Регистр.Date_Time_IDDOC > @НачДата And Регистр.Date_Time_IDDOC < @КонДатаПлюс1 | And Регистр.Сумма != 0" + стрВидыКредДоков; получишь обороты. |
|||
|
18
Anatolik
04.03.09
✎
09:43
|
тем что я это делаю в QA а не из 1с + в (8) и (16) будут работат медленней
|
|||
|
19
Sadovnikov
04.03.09
✎
09:48
|
(18) Это с какого перепуга медленнее-то будет?
"тем что я это делаю в QA а не из 1с" - а этого я вообще не понял... |
|||
|
20
Sadovnikov
04.03.09
✎
09:50
|
+(19) Приведенные запросы я на ура и из кверюги выполню.
|
|||
|
21
Anatolik
04.03.09
✎
10:04
|
(20) ну попробуй
(19) тем что там используются объекты 1с а не простые записи |
|||
|
22
Sadovnikov
04.03.09
✎
10:06
|
(21) "ну попробуй" - не поверишь, каждый день пробую. И, как ни странно, все получается.
"тем что там используются объекты 1с а не простые записи" - чего-то ты с утра не того покурил... |
|||
|
23
Anatolik
04.03.09
✎
10:47
|
(22) может и так.
так какой запрос в QA вставить? зы у меня все получилось =) |
|||
|
24
Sadovnikov
04.03.09
✎
10:50
|
(23) "так какой запрос в QA вставить?" - поясни вопрос?
Имхается мне, что ты просто не понял откуда в запросе регВзаиморасчеты и его поля. Это вьюшки. Сделаны для более удобного написания запросов. |
|||
|
25
Anatolik
04.03.09
✎
10:58
|
(24) я понял откуда регВзаиморасчеты взялись
"ней есть метапарсер имен, который сам переведет все идентификаторы объектов в их реальные имена" мне нужно было ИМЕННО такой запрос который можно выполить из ЛЮБОГО приложения которое подключится к бд 1с. запросы в виде (17) в этом случаии не работают. поэтому я предлагаю вам вставить его в QA и посмотреть на результат |
|||
|
26
Sadovnikov
04.03.09
✎
10:59
|
(25) Блин, ты даже после (24) не понял...
Еще раз: "Это вьюшки. Сделаны для более удобного написания запросов." |
|||
|
27
Anatolik
04.03.09
✎
11:08
|
(26) да понял, ключевая фраза в (25) "выполить из ЛЮБОГО приложения которое подключится к бд 1с" запрос будет приходить НЕ ИЗ 1С
|
|||
|
28
Sadovnikov
04.03.09
✎
11:23
|
(27) Слушай, ну глянь ты уже, наконец, что такое вьюшки. И поверь, что приведенные мною запросы можно выполнить из любого приложения. Не только из 1С...
|
|||
|
29
Anatolik
04.03.09
✎
11:38
|
ссылку
|
|||
|
30
ДенисЧ
04.03.09
✎
11:39
|
Ужо-съ... Скульщики просят ссылку на то, что такое view...
А может того, в дворники? |
|||
|
31
Sadovnikov
04.03.09
✎
11:40
|
(29) У тебя BOL украли?? Ужас...
|
|||
|
32
Sadovnikov
04.03.09
✎
11:40
|
(30) Так ведь еще и не просят. А практически требуют...
|
|||
|
33
ДенисЧ
04.03.09
✎
11:41
|
(32) Да, в дворники не годится...
|
|||
|
34
Anatolik
04.03.09
✎
11:49
|
пля скульщик со стажем 2 дня
|
|||
|
35
Sadovnikov
04.03.09
✎
11:53
|
(34) Тогда просто поверь, что выполнятся мои запросы у меня в базе из любого приложения, умеющего выполнять запросы в скуле.
|
|||
|
36
Anatolik
04.03.09
✎
11:59
|
(35) просто хочу увидеть пример (возможно ссылку)
как я понял вьюшки нужно предварительно создать или они где уже есть? |
|||
|
37
Sadovnikov
04.03.09
✎
12:02
|
(36) Создавать надо. Вот пример для регистров:
Функция СоздатьПредставление_Регистр(МетаРег) фОшибокНет = 1; ИмяТаблицыДвижений = РадугаМД.ИмяТаблицыДвижений(МетаРег.Идентификатор); ИмяТаблицыИтогов = РадугаМД.ИмяТаблицыИтогов(МетаРег.Идентификатор); сзКолонки = СоздатьОбъект("СписокЗначений"); сзДопКолонкиДвижений = СоздатьОбъект("СписокЗначений"); Для н = 1 По МетаРег.Измерение() Цикл МетаИзм = МетаРег.Измерение(н); Колонка = "SP"+РадугаМД.ИДИзмеренияРегистра(МетаРег.Идентификатор, МетаИзм.Идентификатор) + " as "+МетаИзм.Идентификатор; сзКолонки.ДобавитьЗначение(Колонка); КонецЦикла; стрРесурсыДвижений = ""; ЗптРД = ""; Для н = 1 По МетаРег.Ресурс() Цикл МетаРес = МетаРег.Ресурс(н); ИмяРесурса = МетаРес.Идентификатор; Колонка = "SP"+РадугаМД.ИДРесурсаРегистра(МетаРег.Идентификатор, ИмяРесурса); сзКолонки.ДобавитьЗначение(Колонка + " as "+ИмяРесурса); сзДопКолонкиДвижений.ДобавитьЗначение("CASE DebKred WHEN 0 THEN "+Колонка+" ELSE 0 END "+ИмяРесурса+"Приход"); сзДопКолонкиДвижений.ДобавитьЗначение("CASE DebKred WHEN 1 THEN "+Колонка+" ELSE 0 END "+ИмяРесурса+"Расход"); КонецЦикла; сзДопКолонкиДвижений.ДобавитьЗначение("DebKred"); сзДопКолонкиДвижений.ДобавитьЗначение("CASE DebKred WHEN 0 THEN 1 ELSE -1 END ЗнакДвижения"); сзДопКолонкиДвижений.ДобавитьЗначение("LineNo_ LineNo_"); сзДопКолонкиДвижений.ДобавитьЗначение("LineNo_ НомерСтроки"); сзДопКолонкиДвижений.ДобавитьЗначение("ActNo ActNo"); сзДопКолонкиДвижений.ДобавитьЗначение("ActNo НомерДвижения"); Если МетаРег.БыстраяОбработкаДвижений = 1 Тогда сзДопКолонкиДвижений.ДобавитьЗначение("IDDoc IDDoc"); сзДопКолонкиДвижений.ДобавитьЗначение("IDDoc идДокДвижения9"); сзДопКолонкиДвижений.ДобавитьЗначение("Date_Time_IDDoc Date_Time_IDDoc"); сзДопКолонкиДвижений.ДобавитьЗначение("Date_Time_IDDoc идДокДвижения23"); сзДопКолонкиДвижений.ДобавитьЗначение("Date_Time_IDDoc ПозицияДокументаДвижения"); сзДопКолонкиДвижений.ДобавитьЗначение("IDDocDef IDDocDef"); сзДопКолонкиДвижений.ДобавитьЗначение("IDDocDef идВидДокДвижения10"); КонецЕсли; стрКолонки = СписокВСтроку(сзКолонки, ","+РазделительСтрок+СимволТабуляции); //Движения ИмяПредставления = "рег"+МетаРег.Идентификатор; ТекстЗапроса = " |CREATE VIEW "+ИмяПредставления+" AS |SELECT | "+стрКолонки+", | "+СписокВСтроку(сзДопКолонкиДвижений, ","+РазделительСтрок+СимволТабуляции)+" |FROM "+ИмяТаблицыДвижений+" (NoLock) |"; Если СоздатьПредставление(ИмяПредставления, ТекстЗапроса) = 0 Тогда фОшибокНет = 0; КонецЕсли; //Итоги ИмяПредставления = "рег"+МетаРег.Идентификатор+"Итоги"; ТекстЗапроса = " |CREATE VIEW "+ИмяПредставления+" AS |SELECT | "+стрКолонки+", | Period Period, | Period ПериодИтогов |FROM "+ИмяТаблицыИтогов+" (NoLock) |"; Если СоздатьПредставление(ИмяПредставления, ТекстЗапроса) = 0 Тогда фОшибокНет = 0; КонецЕсли; Возврат фОшибокНет; КонецФункции |
|||
|
38
Кириллка
04.03.09
✎
12:03
|
(35)Ты зачем человеку мозг сношаешь? :)
(36)предварительно созданы. |
|||
|
39
ДенисЧ
04.03.09
✎
12:03
|
У нас нечто вроде
USE [Dchernyaev_Vz] GO /****** Object: View [dbo].[Регистр_План_Факт_Движения] Script Date: 03/04/2009 12:03:04 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO Create View [dbo].[Регистр_План_Факт_Движения] As Select RA16986.Date_Time_IDDoc, RA16986.LINENO_, RA16986.ACTNO, RA16986.IDDoc, RA16986.IDDocDef, RA16986.DebKred, SP16987 as Местонахождение, SP16988 as СсылкаНаОснование, SP16989 as МестоХранения, SP16990 as Товар, SP16991 as Партия, SP16992 as ПартияРодитель, SP16993 as СвойствоПартии, SP16995 as Стоимость, SP16996 as СебестоимостьСырья, SP16997 as СуммаРеализации, SP16999 as ПризнакДвижения, SP17000 as КодОперации, SP17001 as ПризнакОтгрузки, SP17002 as Основание, SP17003 as Движение, SP17069 as ЗнакДвижения, SP17456 as спрДокументДвижения, SP16994 as Количество From RA16986 |
|||
|
40
Sadovnikov
04.03.09
✎
12:06
|
(38) Ню-ню :)
(0) Расскажи для чего ты эту возню со скулем затеял? |
|||
|
41
Anatolik
04.03.09
✎
12:14
|
(40) отчетики фомируются минут по 10, а в скуле 5 секунд
всеравно то нужно знать названия таблиц для создания вьюшки я понял что можно создать и с помощью твоего запраса, но нужно выполнить ряд предварительных действий. лично мне удобней как делаю я |
|||
|
42
Sadovnikov
04.03.09
✎
12:21
|
(41) "лично мне удобней как делаю я" - рано или поздно поймешь, что нельзя так делать... Ибо чревато...
|
|||
|
43
Mikeware
04.03.09
✎
12:23
|
(41) "Летят переленые дятлы...."©
|
|||
|
44
Anatolik
04.03.09
✎
12:23
|
(42) чем? записей в бд ведь никаких не делается
|
|||
|
45
Sadovnikov
04.03.09
✎
12:25
|
(44) Например, тем, что в двух базах с одинаковыми МД-никами (с точки зрения 1С-ника одинаковыми), легко могут различаться названия таблиц и колонок в них.
|
|||
|
46
Anatolik
04.03.09
✎
12:25
|
(42) (43) вот чем пинать пояснили лутше б
|
|||
|
47
Anatolik
04.03.09
✎
12:31
|
(45) это я понимаю. НО в другой базе я получу ошибку в запросе и ничего не выполнится. если отойти от 1с и воспользоваться созданием вьюшки (39) то я так же получаю ошибку
|
|||
|
48
Mikeware
04.03.09
✎
12:32
|
(46) Внимательно читай (45).
|
|||
|
49
Sadovnikov
04.03.09
✎
12:32
|
(47) Имхается мне, что тебе стоит заказать эту работу на стороне... А не кидаться на нее с шашкой.
|
|||
|
50
Mikeware
04.03.09
✎
12:34
|
(47) Вьюха будет проецировать "внешние названия полей" на внутренние, поэтому запрос сработает.
1с++ будет работать в базе с поименоваными с точки зрения 1с полями независимо от их внутренних названий, поэтому тоже сработает |
|||
|
51
FAM
04.03.09
✎
12:37
|
Объясните мне, зачем вьюху использовать, когда все то же самое можно напрямую из таблицы запросом 1С++ дернуть? Оно разве не быстрее будет?
З.Ы. единственная причина, которая на ум приходит - использование сторонних прог для вытаскивания данных из 1С... |
|||
|
52
ДенисЧ
04.03.09
✎
12:37
|
(51) Затем, что из не 1с 1с++ не работате.
|
|||
|
53
Sadovnikov
04.03.09
✎
12:38
|
(51) Скорость одинаковая, а писать запросы удобнее.
|
|||
|
54
Mikeware
04.03.09
✎
12:38
|
(51) Ну, метапарсер напрягать не надо :-)
Писать удобнее... |
|||
|
55
Sadovnikov
04.03.09
✎
12:39
|
(51) Пляс, хорошо помогает, когда с базой из кверюги работаешь - запросы отлаживаешь.
|
|||
|
56
Sadovnikov
04.03.09
✎
12:40
|
"Пляс" = "Плюс"
|
|||
|
57
los_hooliganos
04.03.09
✎
12:40
|
А во вьюшинах можно хранить актуальные цены и не париться с ошибкой ORDER BY И GROUP BY.
|
|||
|
58
FAM
04.03.09
✎
12:42
|
(57) это что за ошибка такая?
|
|||
|
59
Anatolik
04.03.09
✎
12:42
|
(50) допустим я буду подключаться к базе не из 1с с компанентой 1с++, а из PHP. всеравно залезать в базу и узнавать как в ней таблицы и поля называются
|
|||
|
60
los_hooliganos
04.03.09
✎
12:43
|
Это когда ORDER BY для получения ТОР из _1sconst самой последней цены в подзапросе, а потом ты группируешь итоговую таблицу.
|
|||
|
61
ДенисЧ
04.03.09
✎
12:44
|
(59) А ты хочешь залезать, не зная структуры?
А с вью можно просто написать SELECT Descr, ПолнНаименование FROM Справочник_Контрагенты , не замораиваясь на SC*, SP и проч. |
|||
|
62
FAM
04.03.09
✎
12:44
|
(59) вот для ентого и надо вьюхи генерить из 1С перед тем, как РНР к базе долбиться
|
|||
|
63
Sadovnikov
04.03.09
✎
12:45
|
(59) Не понял. Ты собрался скуль в инет высовывать?
|
|||
|
64
los_hooliganos
04.03.09
✎
12:45
|
Во как меня валит:
qryConsole : State 42000, native 104, message [Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select list if the statement contains a UNION operator. |
|||
|
65
Sadovnikov
04.03.09
✎
12:46
|
(64) А ты себе по рукам, по рукам. Что бы не делал таких ошибок.
|
|||
|
66
los_hooliganos
04.03.09
✎
12:47
|
(65) В подзапросе без ORDER не обойтись, а иначе такая ошибка.
|
|||
|
67
Sadovnikov
04.03.09
✎
12:48
|
(66) Для получения цены без ORDER BY не обойтись? Кирилл, не смеши мои тапочки...
|
|||
|
68
los_hooliganos
04.03.09
✎
12:50
|
(67) да не... можно конечно, но метапарсеровское $ПоследнееЗначение.Цены.Цена(Цены.ID, :ВыбДата) - не работает. Приходиться ручками править))
|
|||
|
69
Sadovnikov
04.03.09
✎
12:51
|
(68) Не надо пользоваться виртуальными таблицами... ИМХО.
|
|||
|
70
Anatolik
04.03.09
✎
12:52
|
(69) нет.
|
|||
|
71
Sadovnikov
04.03.09
✎
12:53
|
(70) Это ты о чем сейчас? И что?
|
|||
|
72
los_hooliganos
04.03.09
✎
12:54
|
(71)Ну если запрос несложный то нормально, а иначе конечно...
|
|||
|
73
Sadovnikov
04.03.09
✎
12:56
|
(72) Это он в начале несложный. А потом то одно к нему понадобится привинтить, то другое...
|
|||
|
74
Anatolik
06.03.09
✎
09:38
|
вообшем после недолгих мучений пришел к выводу, что вьюшки нужны и с ними удобней
спасибо можно узнать что за МетаРег в (36) метаданные.регистр..... ? |
|||
|
75
Anatolik
06.03.09
✎
09:38
|
сори в (37)
|
|||
|
76
Sadovnikov
06.03.09
✎
09:41
|
(74)
Функция СоздатьПредставленияПоМетаданным() Если фПересоздавать = 1 Тогда КомментарийДляЖурнала = "Полное пересоздание"; Иначе КомментарийДляЖурнала = "Проверка наличия"; КонецЕсли; ЗаписьЖурналаРегистрации(КомментарийДляЖурнала,, "СоздатьПредставленияПоМетаданным",, 3); фОшибокНет = 1; Для н = 1 По Метаданные.Регистр() Цикл МетаРег = Метаданные.Регистр(н); Если СоздатьПредставление_Регистр(МетаРег) = 0 Тогда фОшибокНет = 0; КонецЕсли; КонецЦикла; |
|||
|
77
Anatolik
06.03.09
✎
11:54
|
а в том же (37)
идДокДвижения23 идДокДвижения9 идВидДокДвижения10 цифры в конце имеют какой то тайный смысл? |
|||
|
78
los_hooliganos
06.03.09
✎
12:58
|
(77) это количество символов в строке ID.
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |