Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли "развернуть" таблицу на 90 гр? / 25 сообщений из 35, страница 1 из 2
24.07.2002, 18:47:41
    #32038598
SM
SM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
У меня есть таблица

Field1 Field2 .....FieldN Option
--------------------------------
1 1 .... 1 1
10 10 .... 10 2
100 100 .... 100 3


мне нужно "развернуть" ее на 90 гр и показать в таком виде


FieldName Option1 Option2 Option3
----------------------------------------
Field1 1 10 100
Field2 1 10 100
Field3 1 10 100
.....
FieldN 1 10 100

Данные, естественно, только лишь как пример.
Может кто сталкивался и уже решал подобные заморочки?
...
Рейтинг: 0 / 0
24.07.2002, 18:55:47
    #32038604
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
...
Рейтинг: 0 / 0
24.07.2002, 23:13:25
    #32038642
Дед Маздай
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
Делается тривиально. Посмотрите операторы PIVOT / UNPIVOT.
...
Рейтинг: 0 / 0
25.07.2002, 00:36:36
    #32038647
Дед Маздай
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
Извините, поторопился. Хотя, с другой стороны, Вы же не указали версию :)
...
Рейтинг: 0 / 0
25.07.2002, 02:16:16
    #32038648
SM
SM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
SQL 2000
Не нашел в BOL этих операторов. А можно примерчик? Применительно к моеиу вопросу?
...
Рейтинг: 0 / 0
25.07.2002, 13:05:31
    #32038737
Konst
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
У меня был подобный вопрос. Посмотри.\r
/topic/9171\r
Предложенная процедура помогла выйти из положения.
...
Рейтинг: 0 / 0
25.07.2002, 13:09:17
    #32038742
Александр Степанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
BOL: Accessing and Changing Relational Data \ Advanced Query Concepts \ Transact-SQL Tips \ Cross-Tab Reports

Там есть пример.
...
Рейтинг: 0 / 0
25.07.2002, 20:11:39
    #32038897
SM
SM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
Konst, покажи пример использования это sp для вразения таблицы. Что то я никак сообразить не могу.
...
Рейтинг: 0 / 0
29.07.2002, 12:09:54
    #32039321
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
Cross-Tab Reports
Sometimes it is necessary to rotate results so that columns are presented horizontally and rows are presented vertically. This is known as creating a PivotTable®, creating a cross-tab report, or rotating data.

Assume there is a table Pivot that has one row per quarter. A SELECT of Pivot reports the quarters vertically:

Year Quarter Amount
---- ------- ------
1990 1 1.1
1990 2 1.2
1990 3 1.3
1990 4 1.4
1991 1 2.1
1991 2 2.2
1991 3 2.3
1991 4 2.4

A report must be produced with a table that contains one row for each year, with the values for each quarter appearing in a separate column, such as:

Year
Q1
Q2
Q3
Q4

1990
1.1
1.2
1.3
1.4

1991
2.1
2.2
2.3
2.4



These are the statements used to create the Pivot table and populate it with the data from the first table:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
USE Northwind
GO

CREATE TABLE Pivot
( Year      SMALLINT,
  Quarter   TINYINT, 
  Amount      DECIMAL( 2 , 1 ) )
GO
INSERT INTO Pivot VALUES ( 1990 ,  1 ,  1 . 1 )
INSERT INTO Pivot VALUES ( 1990 ,  2 ,  1 . 2 )
INSERT INTO Pivot VALUES ( 1990 ,  3 ,  1 . 3 )
INSERT INTO Pivot VALUES ( 1990 ,  4 ,  1 . 4 )
INSERT INTO Pivot VALUES ( 1991 ,  1 ,  2 . 1 )
INSERT INTO Pivot VALUES ( 1991 ,  2 ,  2 . 2 )
INSERT INTO Pivot VALUES ( 1991 ,  3 ,  2 . 3 )
INSERT INTO Pivot VALUES ( 1991 ,  4 ,  2 . 4 )
GO


This is the SELECT statement used to create the rotated results:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT Year, 
    SUM(CASE Quarter WHEN  1  THEN Amount ELSE  0  END) AS Q1,
    SUM(CASE Quarter WHEN  2  THEN Amount ELSE  0  END) AS Q2,
    SUM(CASE Quarter WHEN  3  THEN Amount ELSE  0  END) AS Q3,
    SUM(CASE Quarter WHEN  4  THEN Amount ELSE  0  END) AS Q4
FROM Northwind.dbo.Pivot
GROUP BY Year
GO

This SELECT statement also handles a table in which there are multiple rows for each quarter. The GROUP BY combines all rows in Pivot for a given year into a single row in the output. When the grouping operation is being performed, the CASE functions in the SUM aggregates are applied in such a way that the Amount values for each quarter are added into the proper column in the result set and 0 is added to the result set columns for the other quarters.

If the results of this SELECT statement are used as input to a spreadsheet, it is easy for the spreadsheet to calculate a total for each year. When the SELECT is used from an application it may be easier to enhance the SELECT statement to calculate the yearly total. For example:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT P1.*, (P1.Q1 + P1.Q2 + P1.Q3 + P1.Q4) AS YearTotal
FROM (SELECT Year,
             SUM(CASE P.Quarter WHEN  1  THEN P.Amount ELSE  0  END) AS Q1,
             SUM(CASE P.Quarter WHEN  2  THEN P.Amount ELSE  0  END) AS Q2,
             SUM(CASE P.Quarter WHEN  3  THEN P.Amount ELSE  0  END) AS Q3,
             SUM(CASE P.Quarter WHEN  4  THEN P.Amount ELSE  0  END) AS Q4
     FROM Pivot AS P
     GROUP BY P.Year) AS P1
GO

Both GROUP BY with CUBE and GROUP BY with ROLLUP compute the same sort of information as shown in the example, but in a slightly different format.
...
Рейтинг: 0 / 0
29.07.2002, 20:30:48
    #32039521
SM
SM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
Не совсем. Еще раз:
Таблица

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Materail    EndConnection      Option
 --------------------------------------
 
A1           FE                     1 
A2           BE                     2    
A3           FEE                    3  


В результате нужно:

Field                 Option1        Option2         Option3
 ------------------------------------------------------------
 
'Material'              A1              A2                A3
'EndConnection'         FE              BE                FEE
...
Рейтинг: 0 / 0
29.07.2002, 22:19:05
    #32039524
SergCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
Вот работающий код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
SET NOCOUNT ON
create table tmp(Materail varchar( 50 ), EndConnection varchar( 50 ), [Option] int)
insert tmp values('A1','FE', 1 )
insert tmp values('A2','BE', 2 )
insert tmp values('A3','FEE', 3 )

 -- создаем таблицу
 
declare @s varchar( 8000 )
set @s='create table #tmp (Field varchar(50),'

select @s=@s+'[Option'+cast([Option] as varchar( 20 ))+'] varchar(50),'
from tmp
order by [Option]

set @s=left(@s,len(@s)- 1 )+')
'
 -- заполняем таблицу
 
select @s=@s+
  case when c.[Option]=(select min([Option]) from tmp)
    then 'insert #tmp select '''+b.name+ ''','
    else ''
  end+
  '(select '+b.name+' from tmp where [Option]='+cast(c.[Option] as varchar( 20 ))+')
'+case when c.[Option]=(select max([Option]) from tmp) then '' else ',' end
from sysobjects a
cross join tmp c
join syscolumns b on b.id=a.id and b.name<>'Option'
where a.name='tmp'
order by b.colid, c.[Option]

set @s=@s+'select * from #tmp'

SET NOCOUNT OFF
exec(@s)
 --select @s
 

drop table tmp

Специально "слепил". Так что с Вас 5 баксов :-)
...
Рейтинг: 0 / 0
30.07.2002, 01:50:06
    #32039528
RatTail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
А вот мой вариант (сырой, т.к. я лечусь в клинике доктора Мензиса "Просто треп"):

set nocount on
create table t (mat varchar(7), endc varchar(7), ee varchar(7), op int)
insert into t (mat,endc,ee,op) values('1','11','111',1)
insert into t (mat,endc,ee,op) values('2','22','222',2)
insert into t (mat,endc,ee,op) values('3','33','333',3)
insert into t (mat,endc,ee,op) values('4','44','444',5)
insert into t (mat,endc,ee,op) values('5','55','555',4)

declare @i int set @i=1
declare @s varchar(255) set @s='f varchar(7)'
while @i<=(select count(*) from t)
begin set @s=@s+', op'+cast(@i as varchar(255))+' varchar(7)' set @i=@i+1 end
set @s='create table tt ('+@s+')'
exec(@s)

declare @j int set @j=1 declare @n varchar(255)
while @j<(select count(column_name) from information_schema.columns where table_name="t")
begin
set @n=(select column_name from information_schema.columns where table_name="t" and ordinal_position=@j)
insert into tt (f) values(@n)
set @j=@j+1
end

declare @uu varchar(255)
declare @jj int declare @nn varchar(33) declare @ii int set @ii=1
while @ii<(select count(column_name) from information_schema.columns where table_name="t")
begin
set @jj=1
set @nn=(select column_name from information_schema.columns where table_name="t" and ordinal_position=@ii)
while @jj<=(select count(*) from t)
begin
set @uu='update tt set op' + cast(@jj as varchar(33)) +
'=(select ' + @nn + ' from t where op=' + cast(@jj as varchar(33)) + ') where f="' + @nn+ '"'
exec(@uu)
set @jj=@jj+1
end
set @ii=@ii+1
end
set nocount off
select * from tt
drop table t
drop table tt
...
Рейтинг: 0 / 0
30.07.2002, 05:30:46
    #32039534
Sergey Makarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
Все бы было хорошо, если бы использовались временные таблицы. Если несколько пользователей попытаются одновременно запустить приведенные выше процедуры -
create table tmp - получиться нехорошо. Я попробовал переписать с использованием временной таблицы #tmp , однако врем. табоица создается естественно в tempDB, причем в тамошнем sysobjects ее имя "#tmp_______________12345 (какое-то число)". В sysobjects текущей базы ее нет.

Может быть можно каким то образом определить ID созданной врем. таблицы?
...
Рейтинг: 0 / 0
30.07.2002, 09:14:21
    #32039549
Sergey Makarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
Имелось в виду, что "развернуть" мне надо не всю таблицу целиком, а запрос.(который проще запихать во временную таблицу)
...
Рейтинг: 0 / 0
30.07.2002, 09:18:13
    #32039551
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
дайте более детальное описание исходной таблички.....
есть уникальное поле или сочитание полей?
...
Рейтинг: 0 / 0
30.07.2002, 18:34:55
    #32039742
SM
SM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
>дайте более детальное описание исходной таблички.....
>есть уникальное поле или сочитание полей?


В данном случае таблицы могут быть самые разные, интересует так сказать общий подход.
А для примера ppcIndKey int, CommGenKey int, NPSKey int, Option int – будут уникальными сочетаниями полей.

В принципе, следуя вашему примеру и зная какие поля у меня есть, я могу «собирать» insert команды сам, но Ваше решение с syscolumns гораздо более привликательное, жаль что не работает с временной таблицей.
...
Рейтинг: 0 / 0
30.07.2002, 19:44:34
    #32039765
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
а кто вам мешает самому создавать таблици в tempdb?
главное уникальность... типа номер сессии+случайное число... а после этого юзайте по сехеме...
...
Рейтинг: 0 / 0
30.07.2002, 20:23:12
    #32039769
SM
SM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
Да, я думал над этим, только еще не пробовал.
Что-то типа создания уникальной врем. таблицы
@TmpTable='#Tmp' & SELECT CAST(CAST(RAND()*1000000000 AS INT) AS VARCHAR(20))

В этом случае будет динамический запрос с динамическим запросом внутри, поскольку имя таблицы нужно будет подставлять во время исполнения.

from sysobjects a
cross join tmp c
join syscolumns b on b.id=a.id and b.name<>'Option'
where a.name=' tmp '
order by b.colid, c.[Option]

Гораздо проще было бы если бы знать id временной таблицы, тогда вместо a.name='tmp' было бы a.id=@id
...
Рейтинг: 0 / 0
30.07.2002, 20:34:22
    #32039771
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
по моему такая функция и процедура уже есть...
завтра покопаюсь ...
...
Рейтинг: 0 / 0
31.07.2002, 00:09:38
    #32039787
Cat2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
Для SM.
Сталкивался и решал подобные заморочки.

Да плюньте Вы на все эти извраты.
Что вам нужно? Иметь эту табличку на все времена? И по ней будут делатся другие запросы? Сомневаюсь.

Скорее всего нужно что бы юзер полюбовался на развернутую табличку.

В дельфах, например, это можно, сделать загнав данные в
StringGrid. Ведь не 1000х1000 у Вас будет. А хоть бы и такая. Пускай клиент отдувается. У него рожа толстая - 800 МГц.

Пишу без захода в дельфу и проверки, так что могут быть всякие ошибки.

На форме компонента TStringGrid, имя S. Так же имеется результат запроса Q.

S.rowcount:=Q.FieldCount;
S.colcount:=Q.RecordCount+1;
S.FixedRows:=1;
S.FixedCols:=1;

for row:=1 to Q.FieldCount-1 do
S.Cells[0,row]:=Q.Fields[row-1].FieldName;

col:=1;
while not Q.eof do
begin
S.Cells[col,0]:='Option '+Q.FieldByName('Options').asString;

for row:=1 to Q.FieldCount-1 do
S.Cells[col,row]:=Q.Fields[row-1].asString;

inc(col);
Q.next;
end
...
Рейтинг: 0 / 0
31.07.2002, 00:22:56
    #32039788
RatTail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
Молодец, Кэт2! Мочи их всех - ламеров этих, - и своих и заморских. Кстати, объясните мне, самому крупному Ламеру, как будут развиваться события, если перед блоком:
create table tmp (без #)
......
......
drop table tmp
делать проверку на существование таблы "tmp".
Т.е. так, если какой-то юзер в данный момент уже создал эту таблу, но не успел её дропнуть, то воспользоваться уже готовой. Иначе, создавать самому. Я после электрошока плохо (совсем) соображаю.
...
Рейтинг: 0 / 0
31.07.2002, 07:43:54
    #32039799
Cat2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
OFF. Для Rattail. Это у тебя в базе что, филиал дурдома? Твои юзеры имеют право создавать нормальные таблички ?
Болезнь очень запущена.
...
Рейтинг: 0 / 0
31.07.2002, 10:07:52
    #32039824
RatTail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
2Cat2
В моей базе, Брут, возможно всё. Поелику не страдам я
паранойей в открытой форме. А ты всё думаешь, что не
выдь ты завтра на работу, так и рубель российский на 30
пунктов упадет. Ты лучче послушат об чём люд рабочий
гуторит на ихних тусовках: кровопивец ты (и бухгалтерия)
для них. У меня т всё по-ленински: сами рабочие себе
проц. премии вручну вводят в кабинках для тайного
голосовання.
...
Рейтинг: 0 / 0
31.07.2002, 12:23:26
    #32039899
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
да и ваще.... изврат это все.... если нуно универсально используйте OLAP ....
...
Рейтинг: 0 / 0
31.07.2002, 18:21:52
    #32040079
SM
SM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли "развернуть" таблицу на 90 гр?
Мда, олапа мне тут только и не хватало...
Что до задачки, это конечно изврат, но уж больно удобно для конечного пользовтеля - дело в том, что инфа в таблице про инженерный компонент, и Option - это соответственно вариации - немного другой мартериал, рабочее давление, толщина стенок.... Всего значимых полей больше 10. Посмотреть на всю эту картину в разрезе опций одновременно - просто слюнки течь начинают у пользовтелей.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли "развернуть" таблицу на 90 гр? / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]