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

Откуда: Украина
Сообщений: 334
Задача простая есть даты стандартного вида 2012-10-10 00:00:00.000
Для дальнейшей сортировке и группировке по месяца командой GROUP by и order by нужно отсортировать количество продаж по месяцам.
Так вот из даты скорее всего нужно убрать время и день.
Должно получиться
ПродажиДата
25512 10.2012
45256 11.2012

И так далее
Так вот помогите округлить дату
11 окт 12, 21:53    [13305191]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5115
Kimel,

сбоку поле в которое покладите эти ваши месяцы как инты (yyyymm).
см. month(), year()
11 окт 12, 22:08    [13305231]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Kimel
Member

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

пробовал, сделал вот так MONTH(DATE) + '' + YEAR(DATE) даёт ошибку что оно суммируеться как int и вообще мне этот вариант не подходит
11 окт 12, 22:12    [13305235]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5115
Kimel,

а зачем вам там строковый тип для группировки и сортировки???
сделайте так year(date)*100+month(date)
11 окт 12, 22:14    [13305243]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Exproment
Member

Откуда:
Сообщений: 416
нельзя просто взять и выкинуть часть типа данных(если это конечно datetime, а не строка). Чтобы отсортировать по месяцам:
--AdventureWorks
select  * 
from	HumanResources.Employee
order by DATEPART(month, BirthDate);

группировать аналогично, что мешает ?
11 окт 12, 22:16    [13305248]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Kimel
Member

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

MONTH(SalaryDate)+YEAR(SalaryDate)*100

Вот результат

201210

Но его невозможно читать, мне нужен для отчёта в виде 10.2012
11 окт 12, 22:16    [13305253]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Kimel
Member

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

13305253
Нечитабельно
11 окт 12, 22:19    [13305260]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5115
Kimel
Дедушка,

MONTH(SalaryDate)+YEAR(SalaryDate)*100

Вот результат

201210

Но его невозможно читать, мне нужен для отчёта в виде 10.2012

во пушной зверь... как написали в первом посте таков ответ и получили.
staff(convert(varchar(10),SalaryDate,101),3,4,'.')
11 окт 12, 22:26    [13305275]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5115
Дедушка
Kimel
Дедушка,

MONTH(SalaryDate)+YEAR(SalaryDate)*100

Вот результат

201210

Но его невозможно читать, мне нужен для отчёта в виде 10.2012

во пушной зверь... как написали в первом посте таков ответ и получили.
staff(convert(varchar(10),SalaryDate,101),3,4,'.')

пардон, не staff конечно жеж а stuff %)
11 окт 12, 22:27    [13305278]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Exproment
Member

Откуда:
Сообщений: 416
Дедушка
staff(convert(varchar(10),SalaryDate,101),3,4,'.')

Если и так не нравится, то через DateName
11 окт 12, 22:39    [13305308]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [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.Дата_Зарплаты


Берётся сумма по месяцам.
И в результате такая таблица
Прибыль Расходы Зарплаты Дата Итог
80937.1463999999 -2705 888010 69352.1463999999



НО там где дата нужен год и и месяц а не просто месяц.
Но это невозможно так как выборка идёт по месяцам. И КАК тут быть?
11 окт 12, 22:40    [13305310]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Exproment
Member

Откуда:
Сообщений: 416
Kimel, думается мне что вы неправильно понимаете группировку. В своих исходниках вы агрегируете по каждому месяцу для каждого года, т.е.

		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-раз причем агрегирование идет для всех годов из таблицы.

Вам надо группировать сначала по году, а потом по месяцу.
11 окт 12, 22:47    [13305337]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Kimel
Member

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

Хорошо допустим я добавлю чтото типа
select YEAR(DATE),MONTH(DATE),stuff(convert(varchar(10),DATE,101),3,4,'.')
group by  YEAR(DATE),MONTH(DATE)


А потом из всей этой каши выведу ,stuff(convert(varchar(10),DATE,101),3,4,'.')

Но возникает вопрос. Каким образом тогда таблицы соединять
left outer join RS on PR.Дата = RS.Дата_Расхода
left outer join ZS on PR.Дата = ZS.Дата_Зарплаты
11 окт 12, 22:50    [13305344]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5115
ещё раз... группируйте везде по месяцу в виде (int) yyyymm
через него же и соединяйте таблицы
если для некого отображения нужен особый вид даты "читабельный" создайте его отдельно для отображения
11 окт 12, 22:56    [13305362]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Exproment
Member

Откуда:
Сообщений: 416
Если для вывода информации вы хотите использовать метод дедушки, то делайте так:
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 stuff(convert(varchar(10),qdfSales.AddTime,101),3,4,'.')
	),
	RS(Раходы,Дата_Расхода) as (
		select SUM(ExpenseAmount) as Расходы,MONTH (ExpenseDate) as Дата_Расхода from tblExpenses
		group by stuff(convert(varchar(10),ExpenseDate,101),3,4,'.')
		
		
	),
	ZS(Зарплаты,Дата_Зарплаты) as (
		select SUM(SalaryAmount) as Зарплаты,MONTH(SalaryDate) as Дата_Зарплаты from tblSalary
		group by stuff(convert(varchar(10),SalaryDate,101),3,4,'.')
	)

select Прибыль,-Раходы as Расходы,Зарплаты,stuff(convert(varchar(10),Дата,101),3,4,'.'),(Прибыль-Раходы-Зарплаты) as Итог from PR
inner join RS on PR.Дата = RS.Дата_Расхода
inner join ZS on PR.Дата = ZS.Дата_Зарплаты


Но я бы лучше группировал сначала по Году, потом по месяцу, а при выводе превращал два числа в строку.
11 окт 12, 22:56    [13305363]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Kimel
Member

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

как сделать вид yyyymm
11 окт 12, 22:57    [13305365]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5115
Exproment
Если для вывода информации вы хотите использовать метод дедушки, то делайте так:
это не ответ дедушки, а способ получить "читаемое" нечто... ответ дедушки вот 13305243
11 окт 12, 23:00    [13305370]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Exproment
Member

Откуда:
Сообщений: 416
Kimel, В общем яб наверное сделал примерно так:

with 
	PR(Прибыль,Год, Месяц) as (
		SELECT 
		SUM((SalePrice - qdfArrivalsProducts.Price) * qdfSalesProducts.Quantity) AS Прибыль, 
		YEAR(qdfSales.AddTime) 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 YEAR(qdfSales.AddTime) , MONTH(qdfSales.AddTime)
	),
	RS(Раходы,Дата_Расхода) as (
		select SUM(ExpenseAmount) as Расходы, YEAR(ExpenseDate) as Год,MONTH(ExpenseDate) as Месяц
		group by YEAR(ExpenseDate) ,MONTH(ExpenseDate)
		
		
	),
	ZS(Зарплаты,Дата_Зарплаты) as (
		select SUM(SalaryAmount) as Зарплаты,YEAR(SalaryDate)as Год, MONTH(SalaryDate)  as Месяцfrom tblSalary
		group by YEAR(SalaryDate), MONTH(SalaryDate)
	)

select Прибыль,-Раходы as Расходы,Зарплаты,Дата,(Прибыль-Раходы-Зарплаты) as Итог from PR
inner join RS on PR.Месяц = RS.Месяц and PR.год = RS.Год
inner join ZS on PR.Месяц = ZS.Месяц and PR.год = ZS.год
11 окт 12, 23:03    [13305373]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Kimel
Member

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

Благодаря вам у мне всё отлично, зацените.
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 ISNULL(Прибыль,0) as Прибыль,ISNULL(-Раходы,0) as Расходы,ISNULL(Зарплаты,0) as Зарплаты,ISNULL(Дата_Зарплаты,ISNULL(Дата,Дата_Расхода)) as Дата,(ISNULL(Прибыль,0)+ISNULL(-Раходы,0)+ISNULL(Зарплаты,0)) as Итог from PR
full outer join RS on PR.Дата = RS.Дата_Расхода
full outer join ZS on PR.Дата = ZS.Дата_Зарплаты


Сори я не успел использовать ваш вариант так как писал свой, но СВОЙ работает как надо на 1000000000%
Спс за помощь
11 окт 12, 23:05    [13305379]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Exproment
Member

Откуда:
Сообщений: 416
Kimel, только не свой, а Дедушкин изначальный. Теперь как я понимаю у вас появляется проблема с правильным выводом даты(ятоб для месяца был и точка), так ?
11 окт 12, 23:11    [13305392]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Exproment
Member

Откуда:
Сообщений: 416
Kimel
как сделать вид yyyymm

Виноват, не увидел
11 окт 12, 23:15    [13305402]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Kimel
Member

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

Да проблема есть оно мне выдаёт такую дату 201210
НО ГРУППИРОВКА МЕНЯ УСТРАИВАЕТ НА 100%
нужно просто сменить именно вывод даты
12 окт 12, 00:00    [13305549]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [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.Дата_Зарплаты
12 окт 12, 00:01    [13305554]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Exproment
Member

Откуда:
Сообщений: 416
Kimel
Да проблема есть оно мне выдаёт такую дату 201210


Вы хотели формат "yyyymm". 201210 - это и есть формат "yyyymm". Problems ?
12 окт 12, 00:12    [13305589]     Ответить | Цитировать Сообщить модератору
 Re: Как из даты выбрать месяц и год  [new]
Kimel
Member

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

Нене групировка должна быть по уууумм а вывод по мм.уууу
12 окт 12, 00:20    [13305617]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить