Форум: "Базы";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];
ВнизКак колонки сделать строками(SQL) Найти похожие ветки
← →
Kolan © (2006-11-10 15:05) [0]Здравствуйте,
есть таблица:
Name Value
C 1
R 7
L 8
В результате запросо нужно получить:
C R L
1 7 8
Те поменять строки и столбцы местами.
Как сделать такой запрос?
← →
unknown © (2006-11-10 15:18) [1]Нормально - никак.
Только подзапросами :
select
(select .. from..) as "C",
(select .. from..) as "R",
(select .. from..) as "L"
from ...
Если же еще и количество столбцов м.б. не известно
(динамически формируется запрос), то придется
пересмотреть логику.
Если все это для отображения на клиенте - ищи CrossTab
компоненты.
← →
Anatoly Podgoretsky © (2006-11-10 15:42) [2]> Kolan (10.11.2006 15:05:00) [0]
Где, в некоторых местах просто, в других надо потрудиться
← →
Desdechado © (2006-11-10 16:09) [3]Если это просто для отображения, то искать на королевстве делфи nxdbgrid
← →
Kolan © (2006-11-10 19:01) [4]Вот зачем мне это надо:
http://delphimaster.net/view/3-1161622321/
Последние посты...
Так вот мне пользователю надо паказывать измерение так:
Номер, Дата, Кто проводил, и параметры в виде R, L, C, Ct и так далее(те в строчку...)
← →
Kolan © (2006-11-11 16:07) [5]Так что идей нет? Или это невозможно?
← →
sniknik © (2006-11-11 16:55) [6]гдето просто, гдето потрудится... [2].
← →
evvcom © (2006-11-13 09:28) [7]> [4] Kolan © (10.11.06 19:01)
Лучше нафиг так не делай. Сделай простейшее дерево и TreeList-ом отображай. В корне
> Номер, Дата, Кто проводил
а в листьях
> параметры в виде R, L, C, Ct и так далее
но для каждого своя строка. Имхо.
← →
Stanislav © (2006-11-13 10:39) [8]На MS SQL примерно делается так:
Select
C=Case when name="C" then max(value) else Null end
R=Case when name="R" then max(value) else Null end
from table
group by name
← →
Kolan © (2006-11-13 12:12) [9]> но для каждого своя строка. Имхо.
Нет это негодится.. Таких записей много. Одна строчка-одно измерение.
> Stanislav © (13.11.06 10:39)
Не очень понял..
← →
Kolan © (2006-11-13 12:15) [10]Вот что я хочу на примере:
Дано 2 таблицы:
ParamsMeasurmentID ParamID ParamValue
1 1 10.0
1 2 20.0
1 3 33.0
и
ParamsDictionaryParamID ParamName
1 R
2 L
3 C
Вот запрос:SELECT Params.MeasurmentID, ParamsDictionary.ParamName, Params.ParamValue FROM
Params, ParamsDictionary
WHERE
Params.ParamID = ParamsDictionary.ParamID
Получаю:
№ ParamName Value
1 R 10.0
1 L 20.0
1 C 33.0
А нужно так:№ R L C
1 10.0 20.0 33.0
← →
Kolan © (2006-11-13 12:16) [11]Черт, все испртилось :( Понятно? Или еще раз запостить?
← →
Stanislav © (2006-11-13 12:18) [12]Так и будет, если у тебя MS SQL.
← →
Stanislav © (2006-11-13 12:20) [13]Только в Group by нужно № поставить.
← →
Kolan © (2006-11-13 12:20) [14]> [12] Stanislav © (13.11.06 12:18)
> Так и будет, если у тебя MS SQL.
Это ты T-Sql использовал? Без него никак?
И к тому же тут жестко заданы имена, а их надо выбрать из Словоря...C=Case when name="C" then max(value) else Null end
← →
Kolan © (2006-11-13 12:25) [15]Попробовал.. Не получилос. Напиши с моими именами полей и таблиц
Я сдела так: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".
← →
Stanislav © (2006-11-13 12:27) [16]Это чистый SQL.
Есть хранимка, но она не работает с большим кол-вом столбцов. если надо опубликую, но там уже T-SQL.
Если Акцесс там встроеный оператор есть.
← →
Stanislav © (2006-11-13 12:28) [17]Запятая нужна
C=Case when name="C" then max(value) else Null end,
← →
Kolan © (2006-11-13 12:32) [18]Неполучается :(
Запутался... name="C" - это что за имя? Из какой таблицы?
← →
ЮЮ © (2006-11-13 12:33) [19]Ты сам пошел этим путем.
Если в каждом измерении есть 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:38) [20]> Если в каждом измерении есть R, L, и С, то и стоило их делать
> атрибутами сущности Измерения.
В том все и дело, что параметров - н штук, поэтому и сделал соварь отдельно...
Запрос понял, получилось.. Осталось одно но :)
Как сделать для неизвестного числа параметров?
← →
Kolan © (2006-11-13 12:39) [21]И к томуже имена опять вручную, а если пользоваетль изменит L на Ln...
← →
ЮЮ © (2006-11-13 12:44) [22]
> Как сделать для неизвестного числа параметров?
Динамически! Научи программу написать подобный запрос, основываясь на таблице ParamsDictionary
← →
Kolan © (2006-11-13 12:47) [23]> [22] ЮЮ © (13.11.06 12:44)
>
> > Как сделать для неизвестного числа параметров?
>
>
> Динамически! Научи программу написать подобный запрос, основываясь
> на таблице ParamsDictionary
Понял. Думал это все база делает :)
← →
Stanislav © (2006-11-13 13:01) [24]Вот хранимка для динамического построения, честно говоря сам ей не пользуюсь - неудобно, все делаю компонентами отображения.
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 13:05) [25]Убил, я еще не дорос до этого :(
Лана, пойду у препода спрошу мож он обяснить...
А как ты средаствами отображения это делаешь?
← →
Stanislav © (2006-11-13 13:24) [26]Отчеты в Excel Через сводную таблицу.
В FastReport мучатся долго нужно.
А хранимку текст скопируй в QA и выполни, потом вызывать ее так:
sp_CrossW
@table = "MyTable",
@onrows = "№" - в твоем случае
@oncols = "NAME"
@sumcol = "Value"
@Condition = "where ...", можно ""
← →
atruhin © (2006-11-13 15:52) [27]> В FastReport мучатся долго нужно.
Ну ну целый компонент CrossTab на форму кинуть ! :)
← →
Stanislav © (2006-11-13 16:21) [28]atruhin © (13.11.06 15:52) [27]
Он тормозит, к тому же есть много ограничений.
← →
имя (2006-11-13 17:19) [29]Удалено модератором
← →
Alex' (2006-11-14 11:47) [30]В 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-14 12:09) [31]к [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
← →
Stanislav © (2006-11-14 14:49) [32]Alex" (14.11.06 11:47) [30]
Классная штука, я использую, только динамически все равно не получиться.
← →
Kolan © (2006-11-16 11:47) [33]Это ппц. Справился :) Понадобилось 3 чрон процедуры сделать, создать таблицу и View все динамически...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.046 c