Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.84.155] |
|
Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Страницы: (15) « Первая ... 2 3 [4] 5 6 ... 14 15 все ( Перейти к последнему сообщению ) |
Сообщ.
#46
,
|
|
|
Сообщ.
#47
,
|
|
|
Все более тяжелые отчеты просят от меня
Подскажите концептуально: Есть 3 отдельных запроса, в каждом из которых результатом является 1 строка, 2 числа: СуммаПриход, СуммаРасход Как мне получить отчет, где будет: НазваниеЗапроса(произвольное название), СуммаПриход, СуммаРасход |
Сообщ.
#48
,
|
|
|
SELECT 'Запрос 1' AS НазваниеЗапроса, СуммаПриход, СуммаРасход FROM [query1] UNION ALL SELECT 'Запрос 2' , СуммаПриход, СуммаРасход FROM [query2] UNION ALL SELECT 'Запрос 3' , СуммаПриход, СуммаРасход FROM [query3] |
Сообщ.
#49
,
|
|
|
Как-то можно оптимизировать это?
Select 'Выручка консультантов' as Вид, СуммаПриход, СуммаРасход from ( Select sum(PaymentDetail.Value) AS СуммаПриход, СуммаРасход = 0 From Payment left JOIN PaymentDetail ON Payment.ID = PaymentDetail.PaymentID where (Payment.FileAs not LIKE N'%-1%') and YEAR(Payment.Date) = YEAR( GETDATE( )) and MONTH(Payment.Date) between 1 and MONTH(GETDATE( ))-1 ) as запрос1 Union all Select 'Проектные расходы' , Запрос2.СуммаПриход, Запрос3.СуммаРасход from ( Select sum(PaymentDetail.Value) AS СуммаПриход From Payment left JOIN PaymentDetail ON Payment.ID = PaymentDetail.PaymentID where (Payment.FileAs LIKE N'%-1%') and YEAR(Payment.Date) = YEAR( GETDATE( )) and MONTH(Payment.Date) between 1 and MONTH(GETDATE( ))-1 ) as Запрос2, ( Select sum(Expense.TotalPC) AS СуммаРасход From Expense where Expense.EmployeeID=1386 and YEAR(Expense.Date) = YEAR( GETDATE( )) and MONTH(Expense.Date) between 1 and MONTH(GETDATE( ))-1 ) as Запрос3 Union all Select 'РКО\ПКО' , Запрос4.СуммаПриход, Запрос5.СуммаРасход from ( select sum(ExpenditureEntry.Total) AS СуммаПриход from ExpenditureEntry where (ExpenditureEntry.ExpenditureTypeID = 1 or ExpenditureEntry.ExpenditureTypeID =5 or ExpenditureEntry.ExpenditureTypeID =6 or ExpenditureEntry.ExpenditureTypeID =7) and ExpenditureEntry.CostCenterID = 20/*РКО*/ and YEAR(ExpenditureEntry.Date) = YEAR( GETDATE( )) and MONTH(ExpenditureEntry.Date) between 1 and MONTH(GETDATE( ))-1 ) as Запрос4, (select sum(ExpenditureEntry.Total) AS СуммаРасход from ExpenditureEntry where ExpenditureEntry.CostCenterID = 21 /*ПКО*/ and YEAR(ExpenditureEntry.Date) = YEAR( GETDATE( )) and MONTH(ExpenditureEntry.Date) between 1 and MONTH(GETDATE( ))-1 ) as Запрос5 например хочется условие по времени вынести куда-то(функция\процедура) и туда передовать дату. Возможно что-то ещё я сделал |
Сообщ.
#50
,
|
|
|
1) UNION ALL не оптимизируется. Можно оптимизировать только отдельные его подзапросы.
2) Подзапросы независимы, так что параметры нужно передавать в каждый из них. 3) Если хочется передавать параметр один раз - его можно передать через локальную переменную либо создать хранимую процедуру с параметрами. 4) Объединить условия в подзапросах не получится - подзапросы независимы. Да и нет в том смысла (см. п. 1). |
Сообщ.
#51
,
|
|
|
В sqlcmd можно делать переменные, можно ли их потом использовать для всех запросов?
например я использую везде between '01.08.2017' and '31.08.2017 23:59' и можно ли сделать 2 переменные для начальной даты и конечной даты и их распространить на все запросы? |
Сообщ.
#52
,
|
|
|
Цитата ^D^ima @ between '01.08.2017' and '31.08.2017 23:59' Не знаю, какую БД ты используешь. В MS SQL в условии есть баг. Запись, созданная в 23:59:59.100 в результат не попадет. Лучше использовать ...>= '01.08.2017' and ...<'01.09.2017' |
Сообщ.
#53
,
|
|
|
MIF
MS SQL. Спасибо за совет |
Сообщ.
#54
,
|
|
|
Цитата Akina @ 1) UNION ALL не оптимизируется. Можно оптимизировать только отдельные его подзапросы. Как можно сделать итог суммаприхода, суммарасхода и разница между ними как на картинке? Прикреплённый файлsql.png (7,26 Кбайт, скачиваний: 823) |
Сообщ.
#55
,
|
|
|
Цитата ^D^ima @ Как можно сделать итог WITH ROLLUP Цитата ^D^ima @ и разница между ними Ну это уже пусть клиентская часть попыхтит... |
Сообщ.
#56
,
|
|
|
Цитата Akina @ WITH ROLLUP У меня 4 строки - 4 отдельных запроса, объединенных UNION ALL и в какой секции WITH ROLLUP нужно использовать? Добавлено use PJM10 Select QUOTENAME('Выручка консультантов','"') as Вид, СуммаПриход, СуммаРасход from ( Select sum(PaymentDetail.Value) AS СуммаПриход, СуммаРасход = 0 From Payment left JOIN PaymentDetail ON Payment.ID = PaymentDetail.PaymentID where (Payment.FileAs not LIKE N'%-1%') and Payment.PaymentTypeID = 2 and (YEAR(Payment.Date) = YEAR( GETDATE( )) and MONTH(Payment.Date)=MONTH(GETDATE( ))-1) ) as запрос1 Union all Select QUOTENAME('Проектные расходы','"') ,Запрос2.СуммаПриход, Запрос3.СуммаРасход from ( Select sum(PaymentDetail.Value) AS СуммаПриход From Payment left JOIN PaymentDetail ON Payment.ID = PaymentDetail.PaymentID where (Payment.FileAs LIKE N'%-1%') and Payment.PaymentTypeID = 2 and (YEAR(Payment.Date) = YEAR( GETDATE( )) and MONTH(Payment.Date)=MONTH(GETDATE( ))-1) ) as Запрос2, ( Select sum(Expense.TotalPC) AS СуммаРасход From Expense where Expense.EmployeeID=1386 and (YEAR(Expense.Date) = YEAR( GETDATE( )) and MONTH(Expense.Date)=9) ) as Запрос3 Union all Select QUOTENAME('Расходы иное','"') ,СуммаПриход=0 , Запрос5.СуммаРасход from (select sum(ExpenditureEntry.Total) AS СуммаРасход from ExpenditureEntry where (ExpenditureEntry.ExpenditureTypeID = 1 or ExpenditureEntry.ExpenditureTypeID =6 or ExpenditureEntry.ExpenditureTypeID =7) and ExpenditureEntry.CostCenterID = 20/*РКО*/ and ( YEAR(ExpenditureEntry.Date) = YEAR( GETDATE( )) and MONTH(ExpenditureEntry.Date)=MONTH(GETDATE( ))-1) ) as Запрос5 Union all Select QUOTENAME('Касса РО','"') ,Запрос6.СуммаПриход , Запрос7.СуммаРасход from ( select sum(ExpenditureEntry.Total) AS СуммаПриход from ExpenditureEntry where ExpenditureEntry.CostCenterID = 21 /*ПКО*/ and ( YEAR(ExpenditureEntry.Date) = YEAR( GETDATE( )) and MONTH(ExpenditureEntry.Date)=MONTH(GETDATE( ))-1 ) ) as Запрос6, (select sum(ExpenditureEntry.Total) AS СуммаРасход from ExpenditureEntry where ExpenditureEntry.ExpenditureTypeID =5 and ExpenditureEntry.CostCenterID = 20/*РКО*/ and ( YEAR(ExpenditureEntry.Date) = YEAR( GETDATE( )) and MONTH(ExpenditureEntry.Date)=MONTH(GETDATE( ))-1) ) as Запрос7 Добавлено Цитата ^D^ima @ WITH ROLLUP и ещё как понимаю ROLLUP покажет подитоги для разных столбцов "вид", т.е. вместо 5 строки он добавит ещё 5(4 было + 4 подитого + 1 общий итог) |
Сообщ.
#57
,
|
|
|
Цитата ^D^ima @ У меня 4 строки - 4 отдельных запроса, объединенных UNION ALL и в какой секции WITH ROLLUP нужно использовать? Обернуть всё это внешним запросом, добавить группировку по полю "Вид" и обернуть в SUM() остальные поля. |
Сообщ.
#58
,
|
|
|
Akina
спасибо |
Сообщ.
#59
,
|
|
|
Цитата Akina @ Обернуть всё это внешним запросом А в поле select что писать, если там через union 3 отдельных запроса сделаны? |
Сообщ.
#60
,
|
|
|
Цитата ^D^ima @ А в поле select что писать SELECT Вид, SUM(СуммаПриход) СуммаПриход, SUM(СуммаРасход) СуммаРасход FROM (твой запрос с 4 подзапросами и 3 UNION-ами) dummy GROUP BY Вид WITH ROLLUP |