Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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 таблицы:

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.048 c
15-1168866930
Tirael
2007-01-15 16:15
2007.02.04
как откючить субтитры в игрушке


6-1157100295
tvv
2006-09-01 12:44
2007.02.04
Работа с каталогами по сети


15-1168909462
Tirael
2007-01-16 04:04
2007.02.04
баян


2-1169119105
Garacio
2007-01-18 14:18
2007.02.04
переключение чтение/запись-чтение для USB


1-1165824158
ZFS
2006-12-11 11:02
2007.02.04
MDI-приложение





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский