![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Двухмерный отчет [D6]
}|{yk © (2004-03-19 17:25:00)Получаю я из запроса отчеи вида
LINE---DATE------SUMM
1.1 - 01.01.04 - 15
1.2 - 01.01.04 - 17
1.3 - 01.01.04 - 3
1.4 - 01.01.04 - 0
-------------------
-------------------
1.3 - 12.01.04 - 3
1.4 - 12.01.04 - 0
-------------------
-------------------
1.1 - 31.01.04 - 15
1.2 - 31.01.04 - 17
1.3 - 21.01.04 - 3
1.4 - 31.01.04 - 0
Т.е. сумму по статьям за месяц. Не подскажете как создать перекрестную таблицу типа
----DATE
---- 01.01.04-02.01.04-03.01.04-...
LINE
1.1 15
1.2 17
1.3 3
..
Загвоздка в том что этот отчет нужет в Excel-e (тетки привыкли в нем работать и нечего другого не хотят). Но запрос отрабатываем за 1 секунду (возвращает всего где-то 8000 записей), а вот передача в Excel занимает до 40 секунд.
Oldster (2004-03-20 09:46:00) [1]/*
Для MS SQL Server. Откуда мы взяли этот пример - забыл.
Реализация перекрестного запроса, когда количество столбцов заранее неизвестно
*/
CREATE PROCEDURE sp_CrossTab
@table AS sysname,
@onrows AS nvarchar(128),
@onrowsalias AS sysname = NULL,
@oncols AS nvarchar(128),
@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 ''' + @key + ''' THEN ' + CASE
WHEN @sumcol IS NULL THEN '1'
ELSE @sumcol
END + @NEWLINE +
' ELSE 0' + @NEWLINE + ' END) AS c' + @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
Эту процедуру можно поместить в базу данных "MASTER" MS SQL Server и использовать с любыми таблицами.
Вызов этой хранимой процедуры
EXEC sp_CrossTab
@table = #tmpTable,
@onrows = 'ID_Client, Name_Client',
@oncols = 'Schet',
@sumcol = 'Summa'
Mim (2004-03-20 08:21:00) [2]Конечно переходите на fr. Если идти на поводу у дамочек, то ни о какой автоматизации речи быть не может. Передавайть данные на счеты они не просят? :)
}|{yk (2004-03-19 18:39:00) [3]да. Таблица то формируется но ужасно медленно. Хотя сейчас я подумывю о FastReport, надоело руцями отчеты делать. Использовал XLReport но для серьйозных отчетов он не годиться
Polevi (2004-03-19 18:17:00) [4]у тебя проблемы с передачей данных екселю