Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.04;
Скачать: CL | DM;

Вниз

Как колонки сделать строками(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 таблицы:

Params  
MeasurmentID ParamID ParamValue
1 1 10.0
1 2 20.0
1 3 33.0


и

ParamsDictionary  
ParamID 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.047 c
2-1168952409
KygECHuK
2007-01-16 16:00
2007.02.04
DLL


1-1165585804
Феникс
2006-12-08 16:50
2007.02.04
Экспорт в Excel - (не зарегистрирован класс LeftMargin)


2-1168832729
Кубоид
2007-01-15 06:45
2007.02.04
Как написать функцию проверки столкновений двух сфероидов?


15-1168412476
Rouse_
2007-01-10 10:01
2007.02.04
Хех, Твой ник по японски :)


2-1168862299
Barma
2007-01-15 14:58
2007.02.04
DrawGrid