![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как колонки сделать строками(SQL)
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