Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как упростить SELECT запрос?  [new]
Kimel
Member

Откуда: Украина
Сообщений: 334
select Прибыль,Расходы,Зарплаты, Прибыль+Расходы+Зарплаты,Дата from (
select SUM(Прибыль) as Прибыль,-SUM(ExpenseAmount) as Расходы,-SUM(SalaryAmount) as Зарплаты,Дата  from (

SELECT 
 
SUM((SalePrice - qdfArrivalsProducts.Price) * qdfSalesProducts.Quantity) AS Прибыль, 

MONTH (qdfSalesProducts.addtime) AS Дата 
	FROM qdfSalesProducts 
 left outer JOIN qdfArrivalsProducts  ON  qdfSalesProducts.ProductID = qdfArrivalsProducts.ProductID 
 left outer JOIN qdfSales ON qdfSalesProducts.SaleID = qdfSales.ID 
 left outer JOIN qdfMain ON qdfSalesProducts.ProductID = qdfMain.ID

  WHERE qdfSalesProducts.addtime >= 
 (select top 1 qdfArrivalsProducts.addtime from 
 qdfArrivalsProducts where ProductID = qdfSalesProducts.ProductID order by addtime desc ) 


 GROUP BY MONTH (qdfSalesProducts.addtime)
) a 
inner  join tblExpenses on Дата =  MONTH(ExpenseDate)
inner join tblSalary on Дата = MONTH(SalaryDate)
group by Дата) b 

Всё на самом деле просто. Есть запрос результат которого Прибыль Дата. Дата это число месяца. И мне нужно к этому подключить расходы, по этому запрос прибыли с датой я сделал подзапросом что бы добавить таблицы с расходами.
inner  join tblExpenses on Дата =  MONTH(ExpenseDate)
inner join tblSalary on Дата = MONTH(SalaryDate)


А дальше меня дико бесит то что получилось. Получился результат ТИПА
Прибыль Расходы Зарплаты Дата
647980 -8115 -44400 10


И нужно просумировать столбцы Прибыль Расход и Зарплата. И ПРИХОДЕТЬСЯ ДЕЛАТЬ ЕЩЁ ОДИН ЗАПРОС ПОВЕРХ И ОПЯТЬ ДЕЛАТЬ group by опять задавать имена столбцов, я уверен это можно Сделать как-то покороче
10 окт 12, 21:48    [13299087]     Ответить | Цитировать Сообщить модератору
 Re: Как упростить SELECT запрос?  [new]
Exproment
Member

Откуда:
Сообщений: 416
Kimel, и снова, глядя на ваш код, слезы наворачиваются.А именно:
  • форматирование - неужели это так сложно ?
  • использовать алиасы в join наверное тоже невыносимо сложно
  • самое интересное, где алиасы все таки есть, в результирующем наборе они не указаны. Слово "Дата" встречается 6 раз и без алиасов как-то не особо приятно разбираться откуда что берется.

    Исходя из этого, все что вам можно посоветовать не убив уйму своего времени:
  • посмотрите в сторону обобщенных табличных выражений
  • посмотрите в сторону предложения OVER(partition by)
  • 10 окт 12, 22:26    [13299294]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    Mnior
    Member

    Откуда: Кишинёв
    Сообщений: 6724
    Exproment
    убив уйму своего времени
    Именно потому что комячкам на всё положить, поэтому необходим нормальный Code Formatter для TSQL.
    Хотя с другой стороны, то что делается на форуме - извращение. Нельзя делать работу за немощных.
    Kimel
    1. используй WITH.
    2. В запросе скорее ошибка. Связка qdfSalesProducts.ProductID = qdfArrivalsProducts.ProductID не уникальна или Top(1) бессмыслен.
    3. Логическая ошибка. tblExpenses и tblSalary должны группироваться отдельно.
    4. Не забывайте схемы. Они обязательны. В добавок, судя по названиям лучше бы отделить таблицы в отдельные схемы.

    + Форматированный оригинал
    SELECT	 Дата
    	,Прибыль
    	,Расходы
    	,Зарплаты
    	,Прибыль + Расходы + Зарплаты
    FROM  (	SELECT	 A.Дата
    		, Sum(A.Прибыль)	AS Прибыль
    		,-Sum(E.ExpenseAmount)	AS Расходы
    		,-Sum(S.SalaryAmount)	AS Зарплаты
    	FROM  (	SELECT	 Month(SP.addtime)				AS Дата
    			,Sum((SP.SalePrice - AP.Price) * SP.Quantity)	AS Прибыль
    		FROM	          dbo.qdfSalesProducts		SP
    			LEFT JOIN dbo.qdfArrivalsProducts	AP ON AP.ProductID	= SP.ProductID -- addtime?
    			LEFT JOIN dbo.qdfSales			S  ON S.ID		= SP.SaleID
    			LEFT JOIN dbo.qdfMain			M  ON M.ID		= SP.ProductID
    		WHERE	SP.addtime >= (
    			SELECT	Top(1) A.addtime
    			FROM	dbo.qdfArrivalsProducts	A
    			WHERE	A.ProductID = SP.ProductID
    			ORDER BY A.addtime DESC)
    		GROUP BY Month(SP.addtime)
    				)	A -- (Дата,Прибыль)
    		JOIN dbo.tblExpenses	E ON Month(E.ExpenseDate) = A.Дата
    		JOIN dbo.tblSalary	S ON Month(S.SalaryDate)  = A.Дата
    	GROUP BY Дата
    	) B -- (Дата,Прибыль,Расходы,Зарплаты)
    
    + Нада
    ;WITH Products(Дата,Прибыль) AS (
    	SELECT	 Month(SP.addtime)
    		,Sum((SP.SalePrice - AP.Price) * SP.Quantity)
    	FROM	          dbo.qdfSalesProducts		SP
    		LEFT JOIN dbo.qdfArrivalsProducts	AP ON AP.ProductID	= SP.ProductID -- addtime?
    		LEFT JOIN dbo.qdfSales			S  ON S.ID		= SP.SaleID
    		LEFT JOIN dbo.qdfMain			M  ON M.ID		= SP.ProductID
    	WHERE	SP.addtime >= (
    		SELECT	Top(1) A.addtime
    		FROM	dbo.qdfArrivalsProducts	A
    		WHERE	A.ProductID = SP.ProductID
    		ORDER BY A.addtime DESC)
    	GROUP BY Month(SP.addtime)
    ), Expenses(Дата,Расходы) AS (
    	SELECT	 Month(E.ExpenseDate)
    		,-Sum(E.ExpenseAmount)
    	FROM	dbo.tblExpenses	E
    	GROUP BY Month(E.ExpenseDate)
    ), Salary(Дата,Зарплаты) AS (
    	SELECT	 Month(S.SalaryDate)
    		,-Sum(S.SalaryAmount)
    	FROM	dbo.tblSalary	S
    	GROUP BY Month(S.SalaryDate)
    )	SELECT	 P.Дата
    		,P.Прибыль
    		,E.Расходы
    		,S.Зарплаты
    		,P.Прибыль + E.Расходы + S.Зарплаты
    	FROM	     Products	P
    		JOIN Expenses	E ON E.Дата = P.Дата
    		JOIN Salary	S ON S.Дата = P.Дата
    

    А как вы хотели? Чтобы мысли читала?
    11 окт 12, 12:14    [13301477]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    Kimel
    Member

    Откуда: Украина
    Сообщений: 334
    Mnior,

    Я рад что вы меня поняли. Да запрос конечно я некорректно подал, в нём изначально была пара ошибок которые я сам и не заметил, но они из-за невнимательности. Ваша заслуга это то что вы мне подкинули оператор With я о нём слышал но не знал как его юзать, а теперь всё работает как надо, я запрос под себя переписал, спасибо вам.
    11 окт 12, 16:15    [13303612]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    Exproment
    Member

    Откуда:
    Сообщений: 416
    Mnior
    поэтому необходим нормальный Code Formatter для TSQL.

    Да как-то даже не задумывался о его необходимости :) Если не секрет, какой вы используете ? :)
    11 окт 12, 21:57    [13305204]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    Kimel
    Member

    Откуда: Украина
    Сообщений: 334
    СПАСИБО ВСЕМ ВОТ ОКОНЧАТЕЛЬНЫЙ РАБОЧИЙ ВАРИАНТ.
    единственное что я не знаю как из даты выбрать не месяц а месяц.год
    даже топик создал
    with 
    	PR(Прибыль,Дата) as (
    		SELECT 
    		SUM((SalePrice - qdfArrivalsProducts.Price) * qdfSalesProducts.Quantity) AS Прибыль, 
    		MONTH(qdfSales.AddTime) AS Дата 
    			FROM qdfSalesProducts 
    		left outer JOIN qdfArrivalsProducts  ON  qdfSalesProducts.ProductID = qdfArrivalsProducts.ProductID 
    		left outer JOIN qdfSales ON qdfSalesProducts.SaleID = qdfSales.ID 
    		left outer JOIN qdfMain ON qdfSalesProducts.ProductID = qdfMain.ID
    		WHERE qdfSalesProducts.addtime >= 
    		(select top 1 qdfArrivalsProducts.addtime from 
    		qdfArrivalsProducts where ProductID = qdfSalesProducts.ProductID order by addtime desc ) 
    		GROUP BY MONTH(qdfSales.AddTime)
    	),
    	RS(Раходы,Дата_Расхода) as (
    		select SUM(ExpenseAmount) as Расходы,MONTH (ExpenseDate) as Дата_Расхода from tblExpenses
    		group by MONTH(ExpenseDate)
    		
    		
    	),
    	ZS(Зарплаты,Дата_Зарплаты) as (
    		select SUM(SalaryAmount) as Зарплаты,MONTH(SalaryDate) as Дата_Зарплаты from tblSalary
    		group by MONTH(SalaryDate)
    	)
    
    select Прибыль,-Раходы as Расходы,Зарплаты,(Прибыль-Раходы-Зарплаты) as Итог from PR
    inner join RS on PR.Дата = RS.Дата_Расхода
    inner join ZS on PR.Дата = ZS.Дата_Зарплаты
    

    https://www.sql.ru/forum/actualthread.aspx?tid=975714
    11 окт 12, 22:12    [13305239]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    Mnior
    Member

    Откуда: Кишинёв
    Сообщений: 6724
    Kimel
    ВОТ ОКОНЧАТЕЛЬНЫЙ РАБОЧИЙ ВАРИАНТ
    Опять засрал нормальный запрос.
    Ни формата, ни схем у таблиц, ни алиасов. Да ещё и капсом.
    Говнокодер от рождения. ;)

    Exproment
    Да как-то даже не задумывался о его необходимости :) Если не секрет, какой вы используете ? :)
    Поставили меня в тупик.
    Есть некоторые форматеры, разные. Но в основном жуть полная. Для таких как я вааще ничего не подойдёт.
    В итоге многое руками. А с хорошим редактором (Sublime Text 2) вообще легко. Поэтому я провоцирую на написания нормального сильно настраиваемого форматера специально для программеров-извращенцев.
    Можете юзать тот что счас на форуме пиарится (SSMSBoost). Форматер почти любой пойдёт, остальное можно допилить.
    На сомом деле пока руки сами всё "исправляют" разбираешь смысл запроса. Что не убивает - делает нас сильней, в итоге доходит до автоматизма.
    Такие дела.

    А в SqlCodeGuard есть прикольная фишка Code Outline - видна вся структура, если говно-кода туча. Но это не для форумных запросов.
    А нужно именно форматтер для запросов, ибо с остальной структурой всё просто.
    11 окт 12, 23:13    [13305397]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    Kimel
    Member

    Откуда: Украина
    Сообщений: 334
    Mnior,

    Подождика, Я тебя выслушал, сделал везде альясы, формат тоже красивый.
    Какие ты тогда вообще альясы имел ввиду?
    Зачем тут другие альясы когда тут через WITH
    11 окт 12, 23:50    [13305520]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    Kimel
    Member

    Откуда: Украина
    Сообщений: 334
    + Вот как вариант

    with 
    	PR(Прибыль,Дата) as (
    			SELECT 
    				SUM((SalePrice - qdfArrivalsProducts.Price) * qdfSalesProducts.Quantity) AS Прибыль, 
    				(year(qdfSales.AddTime)*100+month(qdfSales.AddTime)) AS Дата 
    			FROM 
    				qdfSalesProducts 
    				left outer JOIN qdfArrivalsProducts  ON  qdfSalesProducts.ProductID = qdfArrivalsProducts.ProductID 
    				left outer JOIN qdfSales ON qdfSalesProducts.SaleID = qdfSales.ID 
    				left outer JOIN qdfMain ON qdfSalesProducts.ProductID = qdfMain.ID
    			WHERE 
    				qdfSalesProducts.addtime >= (select top 1 qdfArrivalsProducts.addtime from 
    				qdfArrivalsProducts where ProductID = qdfSalesProducts.ProductID order by addtime desc ) 
    			GROUP BY 
    				(year(qdfSales.AddTime)*100+month(qdfSales.AddTime))
    	),
    	RS(Раходы,Дата_Расхода) as (
    			SELECT 
    				SUM(ExpenseAmount) as Расходы,
    				(year(ExpenseDate)*100+month(ExpenseDate)) as Дата_Расхода 
    			from 
    				tblExpenses
    			group by 
    				(year(ExpenseDate)*100+month(ExpenseDate))
    		
    		
    	),
    	ZS(Зарплаты,Дата_Зарплаты) as (
    			select 
    				SUM(SalaryAmount) as Зарплаты,
    				(year(SalaryDate)*100+month(SalaryDate)) as Дата_Зарплаты 
    			from 
    				tblSalary
    			group by 
    				(year(SalaryDate)*100+month(SalaryDate))
    	)
    
    			select 
    				ROUND(ISNULL(Прибыль,0),+2) as Прибыль,
    				ISNULL(-Раходы,0) as Расходы,
    				ISNULL(-Зарплаты,0) as Зарплаты,
    				ISNULL(Дата_Зарплаты,ISNULL(Дата,Дата_Расхода)) as Дата,
    				ROUND((ISNULL(Прибыль,0)+ISNULL(-Раходы,0)+ISNULL(-Зарплаты,0)),+2) as Итог 
    			from PR
    				full outer join RS on PR.Дата = RS.Дата_Расхода
    				full outer join ZS on PR.Дата = ZS.Дата_Зарплаты
    
    11 окт 12, 23:57    [13305543]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 31983
    Kimel
    Какие ты тогда вообще альясы имел ввиду?
    "альясы" :-)

    table_alias (Псевдоним)
    11 окт 12, 23:58    [13305546]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    Kimel
    Member

    Откуда: Украина
    Сообщений: 334
    alexeyvg,

    Нафиг мне нужен альяс таблицы если WITH и так их штампует
    12 окт 12, 00:02    [13305560]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    Exproment
    Member

    Откуда:
    Сообщений: 416
    alexeyvg
    Kimel
    Какие ты тогда вообще альясы имел ввиду?
    "альясы" :-)

    table_alias (Псевдоним)

    Альянсы ))) А ссылки ему нужны на библию sql и sql-ex.

    Вообще непонятно, Kimel, откуда у вас такое задание ? Оно требует как минмум начальных знаний T-SQL. Считай все задание за вас форумчане выполнили. Зарплату тоже наверное надо им перечислять )
    12 окт 12, 00:03    [13305562]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    Exproment
    Member

    Откуда:
    Сообщений: 416
    Kimel
    Нафиг мне нужен альяс таблицы если WITH и так их штампует

    1. With ничего не штампует. Это вы их задаете для обобщенных табличных выражений, т.е. CTE(которые вы называете with).
    2.

    + Мастер-кодинг
    	SELECT	 Month(SP.addtime)
    		,Sum((SP.SalePrice - AP.Price) * SP.Quantity)
    	FROM	          dbo.qdfSalesProducts		SP
    		LEFT JOIN dbo.qdfArrivalsProducts	AP ON AP.ProductID	= SP.ProductID -- addtime?
    		LEFT JOIN dbo.qdfSales			S  ON S.ID		= SP.SaleID
    		LEFT JOIN dbo.qdfMain			M  ON M.ID		= SP.ProductID
    	WHERE	SP.addtime >= (
    		SELECT	Top(1) A.addtime
    		FROM	dbo.qdfArrivalsProducts	A
    		WHERE	A.ProductID = SP.ProductID
    		ORDER BY A.addtime DESC)
    	GROUP BY Month(SP.addtime)
    

    SP, AP, S, M - алиасы.
    + Быдло кодинг
    		SELECT 
    		SUM((SalePrice - qdfArrivalsProducts.Price) * qdfSalesProducts.Quantity) AS Прибыль, 
    		MONTH(qdfSales.AddTime) AS Дата 
    			FROM qdfSalesProducts 
    		left outer JOIN qdfArrivalsProducts  ON  qdfSalesProducts.ProductID = qdfArrivalsProducts.ProductID 
    		left outer JOIN qdfSales ON qdfSalesProducts.SaleID = qdfSales.ID 
    		left outer JOIN qdfMain ON qdfSalesProducts.ProductID = qdfMain.ID
    		WHERE qdfSalesProducts.addtime >= 
    		(select top 1 qdfArrivalsProducts.addtime from 
    		qdfArrivalsProducts where ProductID = qdfSalesProducts.ProductID order by addtime desc ) 
    		GROUP BY MONTH(qdfSales.AddTime)
    
    12 окт 12, 00:08    [13305576]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 31983
    Kimel
    alexeyvg,

    Нафиг мне нужен альяс таблицы если WITH и так их штампует
    Чтоб легко читать код.

    И чтоб избежать ошибок типа:
    WHERE qdfSalesProducts.addtime >= (select top 1 qdfArrivalsProducts.addtime from
    qdfArrivalsProducts where ProductID = qdfSalesProducts.ProductID order by addtime desc )

    Поля addtime и ProductID в этом запросе к какой из таблиц qdfArrivalsProducts относятся - к той, которая в подзапросе или которая выше уровнем???
    То есть
    from qdfArrivalsProducts where ProductID = qdfSalesProducts.ProductID 
    эквивалентно
    from qdfArrivalsProducts where qdfSalesProducts.ProductID = qdfSalesProducts.ProductID 
    правильно? то есть можно просто написать
    from qdfArrivalsProducts where 1=1
    :-)

    Это совершенно неочевидно, я думаю, вам несколько дней потребуется для того, что бы найти в документации ответ на этот вопрос, откуда беруться поля в подзапросах.
    12 окт 12, 00:09    [13305579]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    Kimel
    Member

    Откуда: Украина
    Сообщений: 334
    Exproment,

    Во первых у меня зона периферии как у нормального человека, а не как у орла и я не люблю когда всё разделяется отступами по 5 см.
    Во вторых Я делаю СТЕ из таблиц и представлений в которых столбцы называются почти одинаково и эти альянсы задавать как минимум неудобно, нужно выделить часть кода для их задачи, а я БД знаю как свои 5 пальцев.
    В третьих я жлоб и я лучше сам всё буду делать чем платить программисту. Такие данные я не могу доверить даже менеджерам высшего звена не то что бы программисту.
    12 окт 12, 00:12    [13305590]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    Kimel
    Member

    Откуда: Украина
    Сообщений: 334
    alexeyvg,

    ты абсолютно не прав, ты не знаешь структуру бд и объяснять неохота. Я всё сделал в этой секции правильно. Меня интересует не это на данный момент
    12 окт 12, 00:13    [13305596]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 31983
    Kimel
    alexeyvg,

    ты абсолютно не прав, ты не знаешь структуру бд и объяснять неохота. Я всё сделал в этой секции правильно. Меня интересует не это на данный момент
    Разве это хоть как то зависит от структуры??? Вы хоть прочитали, что я написал?

    Это тупая ошибка, независимо от структуры БД
    12 окт 12, 00:37    [13305660]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    Kimel
    Member

    Откуда: Украина
    Сообщений: 334
    Mnior,

    Я переписал весь код проставил альянсы. ВЫ ЭТО ИМЕЛИ ВВИДУ?
    WITH 
    	PR(Прибыль,Дата) AS (
    			SELECT 
    				SUM((SP.SalePrice - AP.Price) * SP.Quantity) AS Прибыль, 
    				(YEAR(S.AddTime)*100+MONTH(S.AddTime)) AS Дата 
    			FROM 
    				qdfSalesProducts AS SP 
    				left outer JOIN qdfArrivalsProducts as AP  ON  SP.ProductID = AP.ProductID 
    				left outer JOIN qdfSales AS S ON SP.SaleID = S.ID 
    			WHERE 
    				SP.addtime >= (
    					SELECT 
    						top 1 AP.addtime 
    					FROM 
    						qdfArrivalsProducts as AP
    					WHERE 
    						AP.ProductID = SP.ProductID 
    					order by 
    						AP.AddTime desc ) 
    			GROUP BY 
    				(YEAR(S.AddTime)*100+MONTH(S.AddTime))
    	),
    	RS(Раходы,Дата_Расхода) AS (
    			SELECT 
    				SUM(EX.ExpenseAmount) AS Расходы,
    				(YEAR(EX.ExpenseDate)*100+MONTH(EX.ExpenseDate)) AS Дата_Расхода 
    			FROM 
    				tblExpenses AS EX
    			GROUP BY 
    				(YEAR(EX.ExpenseDate)*100+MONTH(EX.ExpenseDate))
    		
    		
    	),
    	ZS(Зарплаты,Дата_Зарплаты) AS (
    			SELECT 
    				SUM(S.SalaryAmount) AS Зарплаты,
    				(YEAR(S.SalaryDate)*100+MONTH(S.SalaryDate)) AS Дата_Зарплаты 
    			FROM 
    				tblSalary AS S
    			GROUP BY 
    				(YEAR(S.SalaryDate)*100+MONTH(S.SalaryDate))
    	)
    
    			SELECT 
    				ROUND(ISNULL(PR.Прибыль,0),+2) AS Прибыль,
    				ISNULL(-RS.Раходы,0) AS Расходы,
    				ISNULL(-ZS.Зарплаты,0) AS Зарплаты,
    				ISNULL(ZS.Дата_Зарплаты,ISNULL(PR.Дата,RS.Дата_Расхода)) AS Дата,
    				ROUND((ISNULL(PR.Прибыль,0)+ISNULL(-RS.Раходы,0)+ISNULL(-ZS.Зарплаты,0)),+2) AS Итог 
    			FROM 
    				PR
    				full outer join RS ON PR.Дата = RS.Дата_Расхода
    				full outer join ZS ON PR.Дата = ZS.Дата_Зарплаты
    
    12 окт 12, 00:37    [13305662]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    Mnior
    Member

    Откуда: Кишинёв
    Сообщений: 6724
    И то лучше.
    Вы не везде алиасы используете. В последнем запросе их нет.
    Опять нету схем у таблиц (объектов базы). Это недопустимо.
    Формат конечно не кошерный, но лучше чем был. Табуляция помогает быстро увидеть/выкусить нужную инфу.
    	ROUND(ISNULL(PR.Прибыль,0),+2) AS Прибыль,
    	ISNULL(-RS.Раходы,0) AS Расходы,
    	ISNULL(-ZS.Зарплаты,0) AS Зарплаты,
    	ISNULL(ZS.Дата_Зарплаты,ISNULL(PR.Дата,RS.Дата_Расхода)) AS Дата,
    	ROUND((ISNULL(PR.Прибыль,0)+ISNULL(-RS.Раходы,0)+ISNULL(-ZS.Зарплаты,0)),+2) AS Итог
    ---
    	 Coalesce(ZS.Дата_Зарплаты,PR.Дата,RS.Дата_Расхода)	AS Дата
    	,IsNull( PR.Прибыль	,0)				AS Прибыль
    	,IsNull(-RS.Раходы	,0)				AS Расходы
    	,IsNull(-ZS.Зарплаты	,0)				AS Зарплаты
    	,IsNull( PR.Прибыль	,0)
    	+IsNull(-RS.Раходы	,0)
    	+IsNull(-ZS.Зарплаты	,0)				AS Итог
    --- Старый формат тоже удобен и читабелен
    	 Дата		= Coalesce(ZS.Дата_Зарплаты,PR.Дата,RS.Дата_Расхода)
    	,Прибыль	= IsNull( PR.Прибыль,0)
    	,Расходы	= IsNull(-RS.Раходы,0)
    	,Зарплаты	= IsNull(-ZS.Зарплаты,0)
    	,Итог		= IsNull( PR.Прибыль,0) + IsNull(-RS.Раходы,0) + IsNull(-ZS.Зарплаты,0)
    
    Вы знаете что в редакторах есть блочные выделение? (часто через Alt)

    Есть лишние (не имеющие смысла) скобки. Операторы обычно обрамляются пробелами.
    (YEAR(EX.ExpenseDate)*100+MONTH(EX.ExpenseDate))
    
    Year(EX.ExpenseDate) * 100 + Month(EX.ExpenseDate)
    
    Нет смысла также давать имена колонок по два раза и в определении запроса и в самом запросе. Определитесь, или там или там.
    ZS(Зарплаты,Дата_Зарплаты) AS (
    	SELECT 
    		SUM(S.SalaryAmount) AS Зарплаты,
    		(YEAR(S.SalaryDate)*100+MONTH(S.SalaryDate)) AS Дата_Зарплаты
    

    Мне нужно знать пару-тройку основных принципов форматирования, а у вас их словно 100500 но на самом деле нет - хаос.
    Просто включите здравый смысл.

    Вы не знаете Coalesce. Round в финансах - это даже не говнокод это вандализм. Не должно быть в принципе долей. Доли могут появится только в очень редких случаях при промежуточных вычислениях.
    Ищите причину ошибки (одна штука), а не боритесь с последствиями (100500 случаев)

    Дата имеет другой смысл - это не данные (как Прибыль, Расходы) это опорная информация. Итог - это вторичная информация, обычно это должно вычисляться на клиенте автоматически (но это не обязательно).

    Kimel, не парьтесь, то что вы прирождённый говнокодер это нормально, и это не поменять, вы не станете аккуратным - это привычка выработанная в детстве. А аккуратность она либо есть (во всём) или её нет (во всём).
    Что-бы поменяться нужен внешний сильный фактор и прорва времени. На это почти никто влиять не может.
    Для вас быть аккуратным в коде намного более (в тысячи раз) затратно чем например мне.

    У вас есть (надеюсь) другие навыки, которые необходимы в IT отрасли.
    Даже написать за 5 минут говно-прогу которая должна сдохнуть завтра бывает полезнее. Проверить полезность идеи, так сказать.
    А может вообще в предприниматели пойти, или руководителем. У творчества много граней.
    Но это уже тонкая материя и OffTop.

    IMXO
    12 окт 12, 11:13    [13306954]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    MasterZiv
    Member

    Откуда: Питер
    Сообщений: 34705
    Kimel,

    0 самый вешний запрос над запросом просто не нужен, убирай сразу.

    1 остальные два group by одинаковые, можно оставить только один.
    12 окт 12, 11:23    [13307032]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    MasterZiv
    Member

    Откуда: Питер
    Сообщений: 34705
    Kimel
    Mnior,

    Я рад что вы меня поняли. Да запрос конечно я некорректно подал, в нём изначально была пара ошибок которые я сам и не заметил, но они из-за невнимательности. Ваша заслуга это то что вы мне подкинули оператор With я о нём слышал но не знал как его юзать, а теперь всё работает как надо, я запрос под себя переписал, спасибо вам.


    Ты сначала простым SQL научись пользоваться, with тебе пока не нужен
    12 окт 12, 11:26    [13307064]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    Kimel
    Member

    Откуда: Украина
    Сообщений: 334
    Спасибо за ответы. Я и есть предприниматель в sql 2 недели, есть crm(по моему) программа для учёта товарооборота, но из-за гибкости цен на рынке и остальных фактором чуток под себя перепишу, sql для меня более менее легко к тому же интересно, по этому в принципе всё что я знаю это уже предел, остальное мне не нужно. Мне не нужна оптимизация базы данных, запросов и так далее, как попало но что бы работало и в данный момент всё отлично работает. Вчера например до вечера писал алгоритм определения цен для товара. Альянсы я не могу использовать так как программа их не понимает, она думает что это обращение к таблицы . Например

    select * from
    tblTOVAR as TOVAR
    union select * from TOVAR

    она поймёт первые две строки кода, а на второй ошибку даст потому что начнёт искать объект TOVAR которого в бд нету. Кстати в студии всё работает на 100%. К сожелению 1С я не могу себе позволить, а других рений не нашёл по этому юзаю Склад и Торговля SIMPLSOFT

    Кстати, вот сам код.
    update tblSalesProducts set SalePrice = 
    
    	case
    		when
    			(select Quantity from tblSalesProducts where ProductID = <ProductID> and SaleID = <SaleID>) <= 
    			(select ISNULL(QuantityPerUnit,1) from tblMain where ID=<ProductID>)		
    		THEN 
    			(select PriceOut2 from tblMain where id=<ProductID>) 
    		
    		WHEN (select Quantity from tblSalesProducts where ProductID = <ProductID> and SaleID = <SaleID>) >= 
    			 (select ISNULL(QuantityPerUnit,1) from tblMain where ID=<ProductID>)	and 
    			 (select Quantity from tblSalesProducts where ProductID = <ProductID> and SaleID = <SaleID>) <	
    			 (select DiscOt from tblMain where ID=<ProductID> )
    		
    		THEN 
    			(select PriceOut1 from tblMain where id=<ProductID>) 
    		when
    			(select Quantity from tblSalesProducts where ProductID = <ProductID> and SaleID = <SaleID>) >= 
    			(select DiscOt from tblMain where ID=<ProductID>)		
    		THEN 
    			(select Price from tblMain where id=<ProductID>) 
    		ELSE (select PriceOut1 from tblMain where ID=<ProductID>)
    			
    		END
    where ProductID = <ProductID> and SaleID = <SaleID> and SalePrice IS NULL
    



    Это такой некий триггер который реагирует на добавление записи.
    12 окт 12, 20:53    [13311251]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    Mnior
    Member

    Откуда: Кишинёв
    Сообщений: 6724
    Kimel
    Я и есть предприниматель
    Стандартно.
    Вот так и обижают нашего брата. Приходют, получают бесплатно консультацию, а денюжку то себе в карман.
    Но потом они с плеча - "да ваши знания ничё, а мои Во и шиш вам".
    А по честному нанять (временно) надо было специалиста.
    Предприниматели всегда были варварами - такова их природа.

    Селяви
    12 окт 12, 21:04    [13311311]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    alexeyvg
    Member

    Откуда: Moscow
    Сообщений: 31983
    Kimel
    Альянсы я не могу использовать так как программа их не понимает, она думает что это обращение к таблицы . Например

    select * from
    tblTOVAR as TOVAR
    union select * from TOVAR

    она поймёт первые две строки кода, а на второй ошибку даст потому что начнёт искать объект TOVAR которого в бд нету.
    1. не "Альянсы" а "алиасы"

    Это смешно звучит, всё равно что вместо "цена" человек будет говорить "Ценья" :-)

    2. использовать from table_alias нельзя

    Я же дал ссылку на синтаксис: from table as table_alias
    select * from tblTOVAR as T1
    union all
    select * from tblTOVAR as T2
    

    Kimel
    Такие данные я не могу доверить даже менеджерам высшего звена не то что бы программисту.
    Так не бывает, программисту можно доверить всё. Нужно просто такого найти, нормального.

    Так что вернее будет:
    Kimel
    я жлоб и я лучше сам всё буду делать чем платить программисту
    Это нормальное желание, но говорит о том, что эффективность вашей работы меньше, чем у простого программиста :-( Неправильный какой то бизнес.
    12 окт 12, 21:07    [13311329]     Ответить | Цитировать Сообщить модератору
     Re: Как упростить SELECT запрос?  [new]
    Kimel
    Member

    Откуда: Украина
    Сообщений: 334
    Mnior,

    Дело не в том что я жадный, так и есть но дело в том, что программа как никак эксплуатируется уже и зная истории нескольких фирм на рынке я не хочу что бы кто-то кроме меня имел доступ к таким данным. Программа та не локальная, а для нескольких человек. Ещё зашьёт какой-то код в БД и будет потом шантажировать. Ну нах.
    12 окт 12, 21:08    [13311339]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
    Все форумы / Microsoft SQL Server Ответить