2015-01-30 3 views
1

У меня есть таблица с записями, представляющих клетки на матрице с й, у cordinates и значение для этой позиции, как это:SQL: данные ячейки в матрице

COL1 COL2 COL3 
.... .... ...... 
y1  x1 value11 
y1  x2 value12 
y1  x3 value13 
y2  x1 value21 
y2  x3 value23 

Всех столбцов являются Целыми значениями и только COL3 имеет уникальное ограничение. Я хочу, чтобы доклад этой таблицы в виде матрицы, где как число столбцов и Колличесто строк может меняться, как это:

COL1 X1  X2  X3 
..  ..  ..  .. 
y1 value11 value12 value13 
y2 value21 null value23 

В настоящее время я использую pivot table with dynamic columns, но я получаю это:

COL1 X1  X2  X3 
..  ..  ..  .. 
y1 value11 null  null 
y1 null value12 null 
y1 null  null value13 
y2 value21 null  null 
y2 null  null value23 

Обратите внимание, что мне не нужна функция agregate, как в примере. Дайте мне знать, если вам нужны детали.

+0

Распространенный способ борьбы с этим просто использовать бессмысленный оператор агрегации. Даже если вам НЕ НУЖНО какой-либо агрегации, вы все равно можете использовать группу по своим значениям Y и, скажем, max() для создаваемых вами столбцов. – Xedni

+0

Ответы RDBMS или DBA на это должны обрабатывать это в вашем программном обеспечении отчетов и возвращать данные, как они есть в таблице. Это проблема отображения, а не проблема с данными, поэтому задача приложения заключается в ее обработке. Это может оказаться невыполнимым, поскольку большинство программ написания отчетов являются полным дерьмом, но сложность денормализации данных, подобных этому, частично объясняется этой философией. Утверждение 'PIVOT' предназначалось почти исключительно для хорошо известной агрегации финансового периода. Я не говорю: «Ты не можешь так поступать», я просто объясняю, почему так сложно. –

+0

@Xedni Я использую этот подход, но получаю только одно значение для строки, например: id1, valA, null, null; id1, null, valB, null. Мне интересно, есть ли способ объединить все строки с сохранением id. – sillo01

ответ

1

ОБРАЗЦА ТАБЛИЦА

CREATE TABLE #TEMP(COL1 VARCHAR(50),COL2 VARCHAR(50),COL3 VARCHAR(50)) 

INSERT INTO #TEMP 
SELECT 'y1', 'x1', 'value11' 
UNION ALL 
SELECT 'y1', 'x2', 'value12' 
UNION ALL 
SELECT 'y1', 'x3', 'value13' 
UNION ALL 
SELECT 'y2', 'x1', 'value21' 
UNION ALL 
SELECT 'y2', 'x3', 'value23' 

Получить столбцы для поворота

DECLARE @cols NVARCHAR (MAX) 

SELECT @cols = COALESCE (@cols + ',[' + COL2 + ']', '[' + COL2 + ']') 
       FROM (SELECT DISTINCT COL2 FROM #TEMP) PV 
       ORDER BY COL2 

Нанести CROSS JOIN получить x1, x2, x3 для всех y значений. Затем используйте LEFT JOIN в той же таблице, чтобы идентифицировать каждый y, имеет x1, x2 или . Теперь, когда вы поворачиваете, вы получите матрицу по своему желанию.

DECLARE @query NVARCHAR(MAX) 
SET @query = 'SELECT * FROM 
      (
       SELECT DISTINCT C1.*,T.COL3 
       FROM 
       (
        SELECT DISTINCT T2.COL1,T1.COL2 
        FROM #TEMP T1 
        CROSS JOIN #TEMP T2 
       )C1 
       LEFT JOIN #TEMP T ON T.COL2 = C1.COL2 AND T.COL1 = C1.COL1 
      ) x 
      PIVOT 
      (
       MIN(COL3) 
       FOR COL2 IN (' + @cols + ') 
      ) p 
      ' 

EXEC SP_EXECUTESQL @query 
  • Click here для просмотра результат

EDIT:

Не используйте CAST или CONVERT при выборе столбцов для поворота. Сделайте это внутри pivot.

DECLARE @cols NVARCHAR (MAX) 

SELECT @cols = COALESCE (@cols + ',[' + COL2 + ']', '[' + COL2 + ']') 
       FROM (SELECT DISTINCT COL2 FROM #TEMP) PV 
       ORDER BY COL2 

DECLARE @query NVARCHAR(MAX) 
SET @query = 'SELECT * FROM 
      (
       SELECT DISTINCT C1.*,CAST(T.COL3 AS INT) COL3 
       FROM 
       (
        SELECT DISTINCT T2.COL1,T1.COL2 
        FROM #TEMP T1 
        CROSS JOIN #TEMP T2 
       )C1 
       LEFT JOIN TEMP T ON T.COL2 = C1.COL2 AND T.COL1 = C1.COL1 
      ) x 
      PIVOT 
      (
       MIN(COL3) 
       FOR COL2 IN (' + @cols + ') 
      ) p 
      ' 

EXEC SP_EXECUTESQL @query 
  • Click here для просмотра результат
+0

Я не могу ждать, чтобы попытаться ответить, спасибо – sillo01

+0

Почему? Что случилось? @ sillo01 –

+0

Я забыл упомянуть, что все colums - int. Я использую другой метод для установки «@cols» как [x1], [x2], [x3], ...но я получаю компиляцию ошибок «@query» – sillo01

Смежные вопросы