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

Откуда: Киев
Сообщений: 1387
есть таблица

id ----- title ----- value ------ date
1 ------test -------2----------01.01.2013
2 ------test -------3----------01.01.2013
3 ------test1 ------4----------02.01.2013
4 ------test1 ------5----------03.01.2013
.....

мне необходимо что бы результат выводился так

title ----- 01.01.2013 ----- 02.01.2013 ----- 03.01.2013 -----....
test ----------count(value) ----count(value)-----count(value)----....
test1 --------count(value) ----count(value)-----count(value)---....
......

пример
test ------------5 --------------0 ----------------0 -----------....
test1 -----------0 -------------4 -----------------5 -----------....

необходимо в зависимости от периода построить необходимое количество колонок

Если честно впервые вижу такое.

Помогите кто знает

Спасибо.
16 авг 13, 12:27    [14717904]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
qwerty112
Guest
VIT2708,

это PIVOT , но если к-во колонок - неизвестно, то это только через динамику - 10666785
16 авг 13, 12:49    [14718051]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
qwerty112
VIT2708,

это PIVOT , но если к-во колонок - неизвестно, то это только через динамику - 10666785


период неизвестный, и в примере что то не разберусь пока что к чему!!!!!
16 авг 13, 13:01    [14718117]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
VIT2708,

По ходу проще реализовать это программно чем заморачиваться с запросом

так что вопрос больше не актуален
16 авг 13, 13:14    [14718180]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
IF OBJECT_ID('tempdb..#table') IS NOT NULL DROP TABLE #table
SELECT 1 as id,'test' as title,2 as value,'01.01.2013' as [date]
INTO #table
union  select 2,'test',3,'01.01.2013' 
union  select 3,'test1',4,'02.01.2013' 
union  select 4,'test1',5,'03.01.2013' 

declare @fields varchar(8000)
select  @fields =  ISNULL(@fields,'')+',['+[date]+']'  FROM (SELECT DISTINCT [DATE]  from #table)t
select @fields = STUFF(@fields,1,1,'')
select @fields

declare @sql varchar(max)
set @sql = 'select title,'+@fields+
'from (select title, value,date from #table) s
 pivot(sum(value) for [date] in ('+@fields+')) p'
print @sql
exec(@sql)  
16 авг 13, 13:35    [14718283]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
VIT2708
VIT2708,

По ходу проще реализовать это программно чем заморачиваться с запросом

так что вопрос больше не актуален
Абсолютно правильный подход к формированию отчетов
16 авг 13, 14:01    [14718449]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Empirical
Member

Откуда:
Сообщений: 99
VIT2708
qwerty112
VIT2708,

это PIVOT , но если к-во колонок - неизвестно, то это только через динамику - 10666785


период неизвестный, и в примере что то не разберусь пока что к чему!!!!!


declare @query nvarchar(max) = N'select [date] as rw, [title] as col, [value] as val from your_table'
declare @st nvarchar(max)
set @st = N'
declare @st1 nvarchar(max) 
declare @txt1 nvarchar(max)
set @st1 = ''''
create table #tempiv (rw varchar(max), col varchar(max), val real)
insert into #tempiv(rw,col,val) select rw, col, val from (' + @query + ') as t
DECLARE temp_cursor CURSOR FOR 
select distinct quotename(col) as col from #tempiv
OPEN temp_cursor
FETCH next from temp_cursor into @txt1
WHILE @@FETCH_STATUS = 0
   BEGIN
	  select @st1 = @st1 + @txt1 + '',''  
      FETCH next from temp_cursor into @txt1
   END;
CLOSE temp_cursor
DEALLOCATE temp_cursor
select @st1 = ''select rw,''+substring(@st1,1,len(@st1)-1)+''from (select * from #tempiv) as s pivot(sum(val) for col in (''+substring(@st1,1,len(@st1)-1)+'')) as p'
exec(@st1)
16 авг 13, 14:03    [14718466]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Empirical
Member

Откуда:
Сообщений: 99
[quot Empirical]
VIT2708
пропущено...
поправка:
declare @query nvarchar(max) = N'select [date] as col, [title] as rw, [value] as val from #table'
16 авг 13, 14:07    [14718495]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Empirical, какая-то жуть, генерирующая ошибку...
16 авг 13, 14:09    [14718512]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Empirical
Member

Откуда:
Сообщений: 99
Cygapb-007
Empirical, какая-то жуть, генерирующая ошибку...


Сорри. А что за ошибка?
16 авг 13, 14:27    [14718640]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Empirical
Cygapb-007
Empirical, какая-то жуть, генерирующая ошибку...


Сорри. А что за ошибка?
+
declare @query nvarchar(max) = N'select [date] as rw, [title] as col, [value] as val from your_table'
declare @st nvarchar(max)
set @st = N'
declare @st1 nvarchar(max) 
declare @txt1 nvarchar(max)
set @st1 = ''''
create table #tempiv (rw varchar(max), col varchar(max), val real)
insert into #tempiv(rw,col,val) select rw, col, val from (' + @query + ') as t
DECLARE temp_cursor CURSOR FOR 
select distinct quotename(col) as col from #tempiv
OPEN temp_cursor
FETCH next from temp_cursor into @txt1
WHILE @@FETCH_STATUS = 0
   BEGIN
	  select @st1 = @st1 + @txt1 + '',''  
      FETCH next from temp_cursor into @txt1
   END;
CLOSE temp_cursor
DEALLOCATE temp_cursor
select @st1 = ''select rw,''+substring(@st1,1,len(@st1)-1)+''from (select * from #tempiv) as s pivot(sum(val) for col in (''+substring(@st1,1,len(@st1)-1)+'')) as p'--Зачем это?
exec(@st1)
-- в итоге ничего не выводится
16 авг 13, 14:40    [14718759]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Empirical
Member

Откуда:
Сообщений: 99
Cygapb-007
Empirical, какая-то жуть, генерирующая ошибку...


Еще раз сорри. Попробуйте это
declare @st1 nvarchar(max) = '';
declare @s nvarchar(max) = '';
with tab as (select distinct quotename([date]) as col from #table)
select @s += col + ', ' from tab
select @st1 = 'select rw,' + substring(@s,1,len(@s)-1)+' from (select [date] as col, [title] as rw, [value] as val from #table) as s pivot(sum(val) for col in ('+substring(@s,1,len(@s)-1)+')) as p'
exec(@st1)
16 авг 13, 14:58    [14718926]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Empirical
Member

Откуда:
Сообщений: 99
Empirical
Cygapb-007
Empirical, какая-то жуть, генерирующая ошибку...


Еще раз сорри. Попробуйте это


Собственно, LexusR уже ведь все написал... ) Новосибирск встает раньше Лондона.
16 авг 13, 15:00    [14718955]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Empirical, не надо валить в одну кучу OLTP и OLAP. Построение аналитических отчетов не является приоритетом для Database Engine.
16 авг 13, 15:02    [14718969]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Empirical
Member

Откуда:
Сообщений: 99
Cygapb-007
Построение аналитических отчетов не является приоритетом для Database Engine.

А вот зачем они пивот ввели? Это провоцирует.
16 авг 13, 17:06    [14719862]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Empirical
А вот зачем они пивот ввели? Это провоцирует.
А это палка о двух концах.
С одной стороны в любом Enterprise продукте должны присутствовать механизмы для быстрого временного решения или для обхода неустраняемых косарей.
А с другой пользуются микроскопами все кому не лень и не только для гвоздей, не задумываясь.

Не бывает такого чтобы продукт сам по себе оставался качественным. Пользователи должны знать его не меньше чем производители.
За это кстати нобелевку дали.

КО

PS: Пивот - это синтаксический сахар.
16 авг 13, 18:27    [14720282]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Empirical
Member

Откуда:
Сообщений: 99
а вот можно вопрос такой вот дилетантский попробовать задать (по data warehouse):

Строиться биай система. Первоочередные приоритеты - отчеты для финансовой службы. Предполагается, что SSRS соответственно будет около 50% всего проекта по трудозатратам, SSIS - 40%, SSAS - 10%. Нужно ли начинать с кубов-мартов звездами-снежинками, или для отчетов достаточно таблиц (агрегатных из OLTP).

Т.е. если будет факт-дайменшнз, даже простой отчет будет содержать кучу left joint'ов. А ведь можно физически создать из view индексированную таблицу, рендеринг которой будет практически мгновенен.
16 авг 13, 21:27    [14720751]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
Empirical
а вот можно вопрос такой вот дилетантский попробовать задать (по data warehouse):

Строиться биай система.ен.


вам сюда
https://www.sql.ru/forum/olap-dwh
19 авг 13, 09:50    [14724051]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить