2015-01-23 3 views
1

У меня возникла проблема с построением запроса. После поиска в stackoverflow я думаю, что мне нужна кросс-таблица. Но я не знаю, что именно это. Я думаю, что это будет быстрее, если я покажу вам упрощенную версию моей проблемы. Я был бы рад, если бы вы могли указать мне в правильном направлении.SQLSERVER Выбор строк в виде столбцов, даже если строк недостаточно.

Это пример данных:

ColumnIDToGroup Value 
----------------------- 
    1    AAAA 
    1    BBBB 
    2    AAAA 
    2    BBBB 
    2    CCCC 

Мне нужно создать запрос, чтобы получить данные в этом формате:

ColumnIDToGroup Value1 Value2 Value3 Value4 Value5 
------------------------------------------------------------ 
    1    AAAA  BBBB 'Empty' 'Empty' 'Empty' 
    2    AAAA  BBBB CCCC 'Empty' 'Empty' 

Как workarround, я мог бы принять этот вывод, если он просто построить (если значение не равно нулю, то всегда имеют одинаковый размер)

ColumnIDToGroup  ValueConcat 
------------------------------------- 
    1    AAAABBBB************ 
    2    AAAABBBBCCCC******** 

ответ

1

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

CREATE TABLE #TEMP(ColumnIDToGroup INT,Value VARCHAR(30)) 

INSERT INTO #TEMP 
SELECT 1,    'AAAA' 
UNION ALL 
SELECT 1,    'BBBB' 
UNION ALL 
SELECT 2,    'AAAA' 
UNION ALL 
SELECT 2,    'BBBB' 
UNION ALL 
SELECT 2,    'CCCC' 

Теперь выберите строки из таблицы, создать столбец для значение1, значение2 и т.д., и выбрать дополнительные столбцы для Value4, Value5 Союзом всех и установить текст в пустой.

SELECT *, 
'Value'+CAST(ROW_NUMBER() OVER(PARTITION BY ColumnIDToGroup ORDER BY VALUE)AS VARCHAR(3)) COL 
INTO #NEWTABLE 
FROM #TEMP 
UNION ALL 
SELECT 1,'Empty','Value3' 
UNION ALL 
SELECT 2,'Empty','Value3' 
UNION ALL 
SELECT 1,'Empty','Value4' 
UNION ALL 
SELECT 2,'Empty','Value4' 
UNION ALL 
SELECT 1,'Empty','Value5' 
UNION ALL 
SELECT 2,'Empty','Value5' 

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

DECLARE @cols NVARCHAR (MAX) 

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

Теперь откинуть запрос

DECLARE @query NVARCHAR(MAX) 
SET @query = 'SELECT * FROM 
      (
       SELECT * 
       FROM #NEWTABLE 
      ) x 
      PIVOT 
      (
       MIN(VALUE) 
       FOR COL IN (' + @cols + ') 
      ) p 
      ORDER BY ColumnIDToGroup;' 

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

Если вы хотите в SECON d Указанный формат, вы можете использовать приведенный ниже запрос

;WITH CTE AS 
(
    SELECT *   
    FROM #TEMP 
    UNION ALL 
    SELECT 1,'****' 
    UNION ALL 
    SELECT 2,'****' 
    UNION ALL 
    SELECT 1,'****' 
    UNION ALL 
    SELECT 2,'****' 
    UNION ALL 
    SELECT 1,'****' 
    UNION ALL 
    SELECT 2,'****' 
    UNION ALL 
    SELECT 1,'****' 
    UNION ALL 
    SELECT 1,'***' 
) 
SELECT DISTINCT C2.ColumnIDToGroup, 
-- Convert to single row for each ColumnIDToGroup 
     SUBSTRING(
     (SELECT ' ' + CTE.VALUE 
     FROM CTE 
     WHERE C2.ColumnIDToGroup=ColumnIDToGroup 
     ORDER BY 
     CASE WHEN CTE.VALUE = 'AAAA' THEN 1 
      WHEN CTE.VALUE = 'BBBB' THEN 2 
      WHEN CTE.VALUE = 'CCCC' THEN 3 
     ELSE 4 
     END 
     FOR XML PATH('')),2,200000) ValueConcat 
     FROM CTE C2 
  • Click here для просмотра результат
+0

Не стесняйтесь просить о каких-либо изменений. @Rumpel –

+0

Прежде всего спасибо за помощь. Единственная проблема, которую я вижу там, - это UNION. Идея этого заключается в том, чтобы создать представление или хранимую процедуру, чтобы проконсультироваться с данными простейшим способом. Я не знаю данные в таблице #TEMP, потому что он изменяется. Приложение позади этого постоянно вставляет, обновляя удаление строк. Поэтому я не знаю, как построить объединение динамически. Я имею в виду, если я использую ваш код в процедуре хранилища, например, и после этого я вставляю одну строку (например: ID: 1, значение: CCCC). Я получаю 2 строки с одинаковым значением en COL. (продолжение в следующем комментарии) – Rumpelstinsk

+0

Также, если я удалю одну строку (например, ID: 1, значение: AAAA), у меня не будет COL с Value1. Однако я вижу эту идею, я думаю, что благодаря вам я мог бы решить эту последнюю проблему самостоятельно: D – Rumpelstinsk

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