Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подскажите с запросом  [new]
maksim.yugai
Member

Откуда:
Сообщений: 110
Добрый день.

Подскажите в вопросе. Можно ли формировать столбцы в результирующем запросе в зависимости от количества данных? Т.е., есть таблица с датой и другими данными и в зависимости от выборки для каждого месяца создается новый столбец. Например, как на картинке.

Если можно это сделать, то подскажите, как это реализуется?

Заранее спасибо.

К сообщению приложен файл. Размер - 29Kb
21 июл 16, 08:38    [19434096]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом  [new]
Добрый Э - Эх
Guest
maksim.yugai,

читать про динамический SQL. А заодно - и про PIVOT.
21 июл 16, 08:43    [19434109]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом  [new]
Добрый Э - Эх
Guest
maksim.yugai,

а ещё лучше - перенести логику построения нужного вида отчета на клиентское приложение.
сервер - он для сбора, хранения и обработки информации. А для красивого её отображения люди специально отчетные системы придумывают.
21 июл 16, 08:45    [19434112]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом  [new]
982183
Member

Откуда: VL
Сообщений: 3374
А если лень, то заведи сразу 12 столбцов. И не мучайся.
21 июл 16, 08:45    [19434116]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом  [new]
982183
Member

Откуда: VL
Сообщений: 3374
А если нужен простой отчет, то сгенери таблицу

День
Месяц
Количество

загрузи в EXEL и научи юзера сводным таблицам
21 июл 16, 08:48    [19434122]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
if object_id('tempdb..#tmp') is not null drop table #tmp
create table #tmp (month varchar(10),day int,rings int)



insert #tmp
values('January',1,10),
('January',2,12),
('January',3,11),
('January',4,23),
('January',5,18),
('January',6,34),
('January',7,32),
('January',8,58),
('February',1,35),
('February',2,88),
('February',3,43),
('February',4,67),
('February',5,98),
('February',6,98),
('February',7,98),
('February',8,99),
('February',9,99),
('February',10,100)




DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

select @cols =  COALESCE(@cols + ', ', '') + QUOTENAME(cast(month as varchar)) 
from (select distinct month from #tmp) a 

set @query = 'SELECT day,' + @cols + ' from 
            (
                select 
				     rings
					,day
                    , month
               
                from #tmp
           ) x
            pivot 
            (
                 max(rings)
                for month in (' + @cols + ')
            ) p '


exec(@query)
21 июл 16, 10:21    [19434614]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом  [new]
maksim.yugai
Member

Откуда:
Сообщений: 110
Добрый Э - Эх, 982183,

Спасибо за ответы.

3unknown,

Отдельное спасибо за скрипт. Я немного неправильно поставил вопрос. Входные данные как на 2 скрине. Необходимо получать количество строк и разбивать их по месяцам в длину, а вниз по дням в этом месяце, как на первом скрине.

Сможете помочь так сделать?

Спасибо.

К сообщению приложен файл. Размер - 66Kb
21 июл 16, 12:48    [19435706]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом  [new]
maksim.yugai
Member

Откуда:
Сообщений: 110
3unknown,

Поле со временем hi_createdate.
21 июл 16, 12:48    [19435712]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом  [new]
Mairos
Member

Откуда:
Сообщений: 555
maksim.yugai, как-то так
declare @t table (val int, dt datetime)
insert into @t
values
(1, cast('20160101' as datetime)),
(11, cast('20160101' as datetime)),
(15, cast('20160111' as datetime)),
(6, cast('20160125' as datetime)),
(8, cast('20160201' as datetime)),
(3, cast('20160207' as datetime)),
(34, cast('20160215' as datetime));

SET LANGUAGE Russian

;WITH num(day_num) AS
(
 SELECT 1
 UNION ALL
 SELECT day_num+1 FROM num WHERE day_num < 31
)

select day_num, [Январь], [Февраль], [Март], [Апрель], [Май], [Июнь], [Июль], [Август], [Сентябрь], [Октябрь], [Ноябрь], [Декабрь]
from 
(
select t.val, DATENAME(month,t.dt) as month2, DATEPART(dd, t.dt) as day2, n.day_num
from num n  
left join @t t 
	on n.day_num = DATEPART(dd, t.dt)
) s
PIVOT(count(s.val) for s.month2 in ([Январь], [Февраль], [Март], [Апрель], [Май], [Июнь], [Июль], [Август], [Сентябрь], [Октябрь], [Ноябрь], [Декабрь])) as t
21 июл 16, 15:33    [19437193]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с запросом  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
if object_id('tempdb..#tmp') is not null drop table #tmp
create table #tmp (hi_id int,hi_createdate datetime)

if object_id('tempdb..#fin') is not null drop table #fin
create table #fin(id int identity(1,1) primary key,month varchar(10),day int,rings int)

if object_id('tempdb..#mon') is not null drop table #mon
create table #mon(month varchar(10),dt datetime primary key)



insert #tmp
values
(107,'20160130'),
(108,'20160129'),
(109,'20160128'),
(110,'20160127'),
(111,'20160130'),
(126,'20160212'),
(128,'20160214'),
(129,'20160214'),
(10755,'20160529'),
(10754,'20160528'),
(10753,'20160527'),
(10752,'20160430'),
(10756,'20160530'),
(10755,'20160529'),
(10754,'20160528'),
(10753,'20160527'),
(10752,'20160430'),
(10751,'20160428'),
(10750,'20160425'),
(10749,'20160423'),
(10748,'20160415'),
(10747,'20160325'),
(10746,'20160324'),
(10745,'20160323'),
(10744,'20160323'),
(10743,'20160323'),
(10742,'20160321'),
(10741,'20160321'),
(10740,'20160321'),
(10739,'20160323')


insert #fin(month,day,rings)
select datename(mm,hi_createdate) month,datepart(dd,hi_createdate) day,count(*) rings
from #tmp
group by hi_createdate,datepart(mm,hi_createdate) ,datepart(dd,hi_createdate) 
order by hi_createdate

insert #mon
select distinct month,cast(month+'01 1900' as datetime)  from #fin order by cast(month+'01 1900' as datetime) 

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

select @cols =  COALESCE(@cols + ', ', '') + QUOTENAME(cast(month as varchar)) 
from(select month from #mon) a 


print @cols

set @query = 'SELECT day,' + @cols + ' from 
            (
                select 
				     rings
					,day
                    , month
               
                from #fin
           ) x
            pivot 
            (
                 max(rings)
                for month in (' + @cols + ')
            ) p '


exec(@query)
21 июл 16, 17:47    [19438068]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить