Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как колонки сделать строками(SQL)


Страницы:   1 2

Kolan ©   (2006-11-10 15:05:00) 

Здравствуйте,
 есть таблица:
 Name   Value
  C       1
  R       7
  L       8

В результате запросо нужно получить:
C    R    L
1    7    8
Те поменять строки и столбцы местами.

Как сделать такой запрос?


Kolan   (2006-11-16 11:47:00) [1]

Это ппц. Справился :) Понадобилось 3 чрон процедуры сделать, создать таблицу и View все динамически...


Stanislav   (2006-11-14 14:49:00) [2]

Alex'   (14.11.06 11:47) [30]
Классная штука, я использую, только динамически все равно не получиться.


ЮЮ   (2006-11-14 12:09:00) [3]

к [19]
Кстати, можно и не join-ить таблицу многократно, а использовать case в select:

SELECT MeasurmentID,
   SUM(CASE ParamID WHEN 1 THEN Value ELSE 0 END) AS R,
   SUM(CASE ParamID WHEN 2 THEN Value ELSE 0 END) AS C,
   SUM(CASE ParamID WHEN 3 THEN Value ELSE 0 END) AS L
FROM Params
GROUP BY MeasurmentID


Alex'   (2006-11-14 11:47:00) [4]

В MS SQL 2005 TSQL появились ф-ии PIVOT и UNPIVOT
запрос будет выглядеть примерно:

SELECT [С], [L], [R] FROM MyTable PIVOT (SUM(Value) FOR [Name] IN ([C], [L], [R])) AS PVT

Непроверял, взято http://www.citforum.ru/database/articles/tsql_mssql/


  (2006-11-13 17:19:00) [5]

Удалено модератором


Stanislav   (2006-11-13 16:21:00) [6]

atruhin ©   (13.11.06 15:52) [27]
Он тормозит, к тому же есть много ограничений.


atruhin   (2006-11-13 15:52:00) [7]

> В FastReport мучатся долго нужно.

Ну ну целый компонент CrossTab на форму кинуть ! :)


Stanislav   (2006-11-13 13:24:00) [8]

Отчеты в Excel Через сводную таблицу.
В FastReport мучатся долго нужно.
А хранимку текст скопируй в QA и выполни, потом вызывать ее так:

sp_CrossW
@table = 'MyTable',
@onrows = '№' - в твоем случае
@oncols =  'NAME'    
@sumcol = 'Value'
@Condition = 'where ...', можно ''


Kolan   (2006-11-13 13:05:00) [9]

Убил, я еще не дорос до этого :(
Лана, пойду у препода спрошу мож он обяснить...

А как ты средаствами отображения это делаешь?


Stanislav   (2006-11-13 13:01:00) [10]

Вот хранимка для динамического построения, честно говоря сам ей не пользуюсь - неудобно, все делаю компонентами отображения.
CREATE PROC sp_CrossW
 @table       AS sysname,        
 @onrows      AS nvarchar(256),  
 @onrowsalias AS sysname = NULL,
 @oncols      AS nvarchar(256),  
 @sumcol      AS sysname = NULL ,
 @Condition as nvarchar (256)
AS

DECLARE
 @sql AS nvarchar (4000),
 @NEWLINE AS char(1)

SET @NEWLINE = CHAR(10)

SET @sql =
 'SELECT' + @NEWLINE +
 '  ' + @onrows +
 CASE
   WHEN @onrowsalias IS NOT NULL THEN ' AS ' + @onrowsalias
   ELSE ''
 END
CREATE TABLE #keys(keyvalue nvarchar(100) NOT NULL PRIMARY KEY)

DECLARE @keyssql AS varchar(1000)
SET @keyssql =
 'INSERT INTO #keys ' +
 'SELECT DISTINCT CAST(' +@oncols + ' AS nvarchar(100)) ' +
 'FROM ' + @table

EXEC (@keyssql)

DECLARE @key AS nvarchar(100)
SELECT @key = MIN(keyvalue) FROM #keys

WHILE @key IS NOT NULL
BEGIN
 SET @sql = @sql + ','                   + @NEWLINE +
   '  MAX(CASE CAST(' + @oncols +
                    ' AS NVARCHAR(100))' + @NEWLINE +
   '        WHEN N''' + @key +
          ''' THEN ' + @sumcol+ @NEWLINE +
   '        ELSE NULL'                      + @NEWLINE +
   '      END) AS [' + @key+']'
 
 SELECT @key = MIN(keyvalue) FROM #keys
 WHERE keyvalue > @key
END

SET @sql = @sql         + @NEWLINE +
 'FROM ' + @table      + @NEWLINE +
 @condition+@NEWLINE+
 'GROUP BY ' + @onrows + @NEWLINE +
 'ORDER BY ' + @onrows

PRINT @sql  + @NEWLINE
EXEC (@sql)
GO


Kolan   (2006-11-13 12:47:00) [11]

> [22] ЮЮ ©   (13.11.06 12:44)
>
> > Как сделать для неизвестного числа параметров?
>
>
> Динамически! Научи программу написать подобный запрос, основываясь
> на таблице ParamsDictionary

Понял. Думал это все база делает :)


ЮЮ   (2006-11-13 12:44:00) [12]


> Как сделать для неизвестного числа параметров?


Динамически! Научи программу написать подобный запрос, основываясь на таблице ParamsDictionary


Kolan   (2006-11-13 12:39:00) [13]

И к томуже имена опять вручную, а если пользоваетль изменит L на Ln...


Kolan   (2006-11-13 12:38:00) [14]

> Если в каждом измерении есть R, L, и С, то и стоило их делать
> атрибутами сущности Измерения.

В том все и дело, что параметров - н штук, поэтому и сделал соварь отдельно...

Запрос понял, получилось.. Осталось одно но :)
Как сделать для неизвестного числа параметров?


ЮЮ   (2006-11-13 12:33:00) [15]

Ты сам пошел этим путем.
Если в каждом измерении есть R, L, и С, то и стоило их делать атрибутами сущности Измерения.


> А нужно так:
> №       R     L     C
> 1     10.0  20.0   33.0


Тогда забудь о простых запросах:

SELECT
 pr.MeasurmentID, pR.Value R, pC.Value C, pL.Value L
FROM
 (SELECT * FROM Params WHERE ParamID = 1) pR
 LEFT JOIN (SELECT * FROM Params WHERE ParamID = 2) pC ON
   pr.MeasurmentID = pC.MeasurmentID
 LEFT JOIN (SELECT * FROM Params WHERE ParamID = 3) pL ON
   pr.MeasurmentID = pL.MeasurmentID


Kolan   (2006-11-13 12:32:00) [16]

Неполучается :(
Запутался... name='C' - это что за имя? Из какой таблицы?


Stanislav   (2006-11-13 12:28:00) [17]

Запятая нужна
C=Case when name='C' then max(value) else Null end ,


Stanislav   (2006-11-13 12:27:00) [18]

Это чистый SQL.
Есть хранимка, но она не работает с большим кол-вом столбцов. если надо опубликую, но там уже T-SQL.
Если Акцесс там встроеный оператор есть.


Kolan   (2006-11-13 12:25:00) [19]

Попробовал.. Не получилос. Напиши с моими именами полей и таблиц

Я сдела так:
Select
 C=Case when name='C' then max(value) else Null end
 R=Case when name='R' then max(value) else Null end
from Params
group by MeasurmentID


Получил ошибку:
Line 18: Incorrect syntax near 'R'.


Kolan   (2006-11-13 12:20:00) [20]

> [12] Stanislav ©   (13.11.06 12:18)
> Так и будет, если у тебя MS SQL.

Это ты T-Sql использовал? Без него никак?

И к тому же тут жестко заданы имена, а их надо выбрать из Словоря...
C=Case when name= 'C'then max(value) else Null end


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо