2017-01-25 2 views
1

Я пытаюсь свернуть базу данных так, чтобы только определенные строки становились столбцами. Ниже то, что моя таблица выглядит следующим образом:SQL Pivot только выбирает строки

ID QType  CharV  NumV 
1 AccNum     10 
1 EmpNam  John Inc 0 
1 UW   Josh  0 
2 AccNum     11 
2 EmpNam  CBS   0 
2 UW   Dan   0 

Я хотел бы таблицу выглядеть следующим образом:

ID AccNum  EmpNam 
1 10   John Inc 
2 11   CBS 

У меня есть две основные проблемы, которые я пытаюсь объяснить.

1st: значение, которое я пытаюсь получить, не всегда находится в том же столбце. Поэтому, когда AccNum всегда находится в столбце NumV, EmpName всегда находится в столбце CharV.

2nd: Мне нужно найти способ игнорировать данные, которые я не хочу. В этом примере это будет строка с UW в столбце QType.

Ниже приведен код, который у меня есть:

SELECT * 
    FROM testTable 
    Pivot(
    MAX(NumV) 
    FOR[QType] 
    In ([AccNum],[TheValue]) 
    )p 

Но это дает мне результат ниже:

ID CharV AccNum TheValue 
1   10  NULL 
2   11  NULL 
2 CBS  NULL NULL 
2 Dan  NULL NULL 
1 John IncNULL NULL 
1 Josh NULL NULL 

ответ

3

В этом случае группировка с условной агрегации должно работать. Попробуйте что-то вроде:

SELECT ID 
, MAX(CASE WHEN QType = 'AccNum' THEN NumV END) AS AccNum 
, MAX(CASE WHEN QType = 'EmpNam' THEN CharV END) AS EmpNam 
FROM testTable 
GROUP BY ID 

Поскольку внутренний корпус только получает значение, когда WHEN условие выполняется, функция MAX даст вам желаемое значение. Это, конечно, работает только до тех пор, пока существуют только уникальные QTypes для ID.

Как правило, использование PIVOT в Sql-Server не работает за один шаг, когда ваши условия сложны, особенно если вам нужны значения из разных столбцов. Вы можете развернуть таблицу в двух запросах и присоединиться к ней, но она будет работать плохо и менее читаема, чем мое предложение.

+1

Спасибо, что сработало отлично! Я ценю, что вы даете мне самый простой и простой ответ, а не то, что я думал, что хочу. –

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