powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Редактирование CrossTable
10 сообщений из 10, страница 1 из 1
Редактирование CrossTable
    #32403418
AlTis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ms sql server2000 + adp.
Столкнулся со следующей задачей:
необходимо представить данные в виде CrossTable, причём должно поддерживаться редактирование данных.
Искал что-то подобное, по ссылкам нашёл ХП, которая разворачивает таблицу

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
CREATE PROC sp_CrossTab
  @table        AS sysname,                      -- Table to crosstab
 
  @onrows       AS nvarchar( 128 ),                -- Grouping key values (on rows)
 
  @onrowsalias  AS sysname = NULL,               -- Alias for grouping column
 
  @oncols       AS nvarchar( 128 ),                -- Destination columns (on columns)
 
  @sumcol       AS sysname = NULL                -- Data cells
 
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 ' + 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  -- For debug
 
EXEC (@sql)
GO


Таблицу развернуть получилось. Далее я немного модифицировал код ХП, что именно, результат работы ХП я сохраняю как View, далее закачиваю во временную таблицу, вешаю на таблицу тригер, который изменяет данные в "родных" табл..
Вроде бы всё ок, но я никак не могу нормально отобразить заголовки столбцов.
На этом я и застрял.

Кто нибудь наверняка сталкивался с подобными проблемами.
Поделитесь опытом и скажите, я на верном пути?
Как это вообще делается?
...
Рейтинг: 0 / 0
Редактирование CrossTable
    #32403521
Фотография Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здрастть всем, давненько меня тут не было!

Про верность пути судить не берусь, потому как мне и в голову не приходило редактировать сводные данные. Как то все редактированием исходных решалось. А вообще то есть триггеры Instead of, ими порешать можно. А что касается имен полей, например так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Set Nocount On
	
	If  (@Move_content_id Is Null) Or ( @Move_content_id =  0 )
	Begin
		Select Top  0  Null As Move_line_id, Null As Properties_group_id, Null As [Кол-во]
		Return
	End
	
	Declare @SqlStr VarChar( 7000 ), @orderStr VarChar( 1000 )

	Set @SqlStr = 'Select a.Move_line_id, a.Properties_group_id, Max(a.Move_line_quantity) As [Кол-во]'
	Set @orderStr = ''
	
	Select @sqlstr = @sqlstr + ', Max(Case c.Property_id When ' + Cast(c.Property_id As VarChar( 10 )) + ' Then d.Property_Value End) As [' + d.Property_name + ']',
	@orderStr = (Case @orderStr When '' Then ' Order By ' Else @orderStr + ', ' End) + '[' + d.Property_name + ']'
		From Properties d Inner Join PropertiesGroupsLines c On d.Property_id = c.Property_id
		Inner Join PropertiesGroups b On c.Properties_group_id = b.Properties_group_id
		Inner Join MovesLines a On b.Properties_group_id = a.Properties_group_id
			Where (a.Move_Content_id = @Move_content_id)
				Group By c.Property_id, d.Property_name

	Set @sqlstr = @sqlstr + ' From PropertiesValues d Inner Join PropertiesGroupsLines c On d.Property_value_id = c.Property_value_id Right Outer Join MovesLines a Inner Join PropertiesGroups b On a.Properties_group_id = b.Properties_group_id On c.Properties_group_id = b.Properties_group_id Where (a.Move_Content_id = ' + Cast(@Move_content_id As VarChar( 10 )) + ') Group By a.Move_line_id, a.Properties_group_id' + @orderStr
	
	Execute(@sqlstr)
...
Рейтинг: 0 / 0
Редактирование CrossTable
    #32403613
AlTis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Pavel
Спасибо, но честно говоря я мало чего понял в коде.

2ALL
Неужели никто не делал нечто подобное?
Подскажите куда смотреть...
Я как-то где-то здесь видел коментарий Сенина Виктора по данному вопросу, но никак не могу его(коментарий) найти.
...
Рейтинг: 0 / 0
Редактирование CrossTable
    #32403623
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>но я никак не могу нормально отобразить заголовки столбцов.

что означает сия фраза?
что такое не нормально ?
что такое нормально ?
...
Рейтинг: 0 / 0
Редактирование CrossTable
    #32403636
AlTis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2АлексейК
Попробуй запусти эту ХП.
Заголовки столбцов будут такие : с1, с2, с3........
А мне надо, что бы заголовки столбцов назывались примерно так Товар1, Товар2,.... (Под Товаром подразумеваются данные таблицы @table столбца @oncols)
Я не очень силён в SQL, поэтому и прошу помощи.
...
Рейтинг: 0 / 0
Редактирование CrossTable
    #32403643
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
покажи как вызываешь?

что у тебя в
@onrowsalias AS sysname = NULL, -- Alias for grouping column
...
Рейтинг: 0 / 0
Редактирование CrossTable
    #32403652
AlTis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица t
c r v
1 10 100
2 10 110
3 11 120
4 11 130
5 11 140

exec sp_CrossTab 't','c','СТОЛБЕЦ','r','v'

@onrowsalias - псевдоним столбца, по которому происходит группировка
...
Рейтинг: 0 / 0
Редактирование CrossTable
    #32403799
Фотография Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну я жк в примере показал - As [Кол-во]
т.е. ты можешь сам назначать полям нужные названия. Вот только от универсальной процедурки придется отказаться, либо вводить в нее какие-то дополнительные критерии именования полей.
...
Рейтинг: 0 / 0
Редактирование CrossTable
    #32404485
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно как павел написал при сливе во временную таблицу а можно и кростаб поменять если тебе с не нравится


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
alter PROC sp_CrossTab
  @table        AS sysname,                      -- Table to crosstab
 
  @onrows       AS nvarchar( 128 ),                -- Grouping key values (on rows)
 
  @onrowsalias  AS sysname = NULL,               -- Alias for grouping column
 
  @oncols       AS nvarchar( 128 ),                -- Destination columns (on columns)
 
  @sumcol       AS sysname = NULL                -- Data cells
 
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 ' + CASE
                          WHEN @sumcol IS NULL THEN '1'
                          ELSE @sumcol
                        END + @NEWLINE +
    '        ELSE 0'                      + @NEWLINE +

' END) AS ' + @oncols + @key
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  
  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  -- For debug
 
EXEC (@sql)



если тебе не нравятся значения @оncols - можешь хоть временную таблицу добавить со своими названиями и подставлять их
...
Рейтинг: 0 / 0
Редактирование CrossTable
    #32404754
AlTis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel,АлексейК
Большое спасибо, всё получилось.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Редактирование CrossTable
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]