Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];

Вниз

перекрестные SQL-запросы   Найти похожие ветки 

 
mcmax   (2003-05-14 16:08) [0]

Подскажите плз, как можно ли в Oracle выполнить перекрестный запрос с группировкой?
В Jet SQL это делается при помощи ключевых слов Transform и Pivot, а вот как в Oracle - не знаю?


 
Stas   (2003-05-14 16:13) [1]

Есть х.п. под msSQl если разберешься переделаешь на свой сервак.


 
mcmax   (2003-05-14 16:40) [2]

Не совсем понял что есть х.п. ?
Если пример то кидай, попробую разобраться...


 
Stas   (2003-05-14 16:49) [3]

х.п.-Хранимая процедура (Stored Procedure).

CREATE PROC sp_CrossTabDp
@table AS sysname,
@onrows AS nvarchar(128),
@onrowsalias AS sysname = NULL,
@oncols AS nvarchar(256),
@sumcol AS sysname = NULL ,
@dated as nvarchar(10),
@dateu as nvarchar(10)
AS

DECLARE
@sql AS varchar(8000),
@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 +
" SUM(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 +
"WHERE "+ @sumcol+">="+@DATED+" AND "+@sumcol+"<="+@dateu +@NEWLINE+
"GROUP BY " + @onrows + @NEWLINE +
"ORDER BY " + @onrows

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

Вызываешь ее таким образом:
sp_CrossTabDp
@table = "MyTable",
@onrows = "MyFldRow"
@oncols = "MyCols",
@sumcol = "RESULT"

Где MyTable - таблица с которой берешь данные
MyFldRow - Колонки, данные которых будут строками (через запятую)
MyCols - Имя колонки данные которой будут колонками
RESULT Имя колонки данные которой будут на пересечении (Здесь SUM если разберешься можно max,min и т.д)


 
Stas   (2003-05-14 16:53) [4]

Извеняюсь!!(Предидущая не верная)

Вот Так

CREATE PROC sp_CrossTab
@table AS sysname,
@onrows AS nvarchar(128),
@onrowsalias AS sysname = NULL,
@oncols AS nvarchar(256),
@sumcol AS sysname = NULL

AS

DECLARE
@sql AS varchar(8000),
@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 +
" SUM(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 +
"GROUP BY " + @onrows + @NEWLINE +
"ORDER BY " + @onrows

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

Вызываешь ее таким образом:
sp_CrossTab
@table = "MyTable",
@onrows = "MyFldRow"
@oncols = "MyCols",
@sumcol = "RESULT"

Где MyTable - таблица с которой берешь данные
MyFldRow - Колонки, данные которых будут строками (через запятую)
MyCols - Имя колонки данные которой будут колонками
RESULT Имя колонки данные которой будут на пересечении (Здесь SUM если разберешься можно max,min и т.д)



 
mcmax   (2003-05-14 16:55) [5]

Выглядит страшно :))
Спасибо, пошел вникать...


 
mcmax   (2003-05-15 11:41) [6]

не совсем понятен следующий кусок кода

SET @sql = @sql + "," + @NEWLINE +
" SUM(CASE CAST(" + @oncols +
" AS NVARCHAR(100))" + @NEWLINE +
" WHEN N""" + @key +
""" THEN " + @sumcol+ @NEWLINE +
" ELSE NULL" + @NEWLINE +
" END) AS " + @key

Особенное смущение вызывают оператор Case, When N(что есть N?)?
Вобщем если можешь закоментируй этот кусок, что б до меня дошла логика или кинь пример уже сформированной строки @sql

Заранее спасибо



 
mcmax   (2003-05-15 15:27) [7]

Спасибо уже разобрался...



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.007 c
1-3006
nesterovsky
2003-05-21 12:53
2003.06.02
Как перересовать одну запись в TListView и TTreeView


3-2792
гончий
2003-05-14 15:22
2003.06.02
Правда о (подумайте)


14-3072
Zelius
2003-05-15 20:04
2003.06.02
Подскажите ссылку на коллекцию приятных битмапок!


14-3064
lia
2003-05-16 08:39
2003.06.02
Пример реализации SMTP, POP клиента на паскале...


1-2899
AndreyAs
2003-05-22 18:28
2003.06.02
Событие вложенного объекта в Object Inspector





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский