2013-11-13 6 views
1

Я следующий запросОбъединение нескольких строк в одну строку

SELECT orderno, 
CASE WHEN param_id = 'variant' THEN param_val END AS 'variant', 
CASE WHEN param_id = 'period_from' THEN param_val END AS'period_from', 
CASE WHEN param_id = 'period_to' THEN param_val END AS'period_to', 
CASE WHEN param_id = 'division' THEN param_val END AS 'division', 
CASE WHEN param_id = 'show_div' THEN param_val END AS 'show_div', 
CASE WHEN param_id = 'group_div' THEN param_val END AS 'group_div', 
FROM orderreport 

order by orderno 

Это возвращает сетку, подобную ниже (есть еще ряд колонн, которые я снял с целью вопроса) Существует также бесконечное число порядков nos

orderno | variant | period_from | period_to | division | show_div | group_div 
3 | AH003 | NULL | NULL | NULL | NULL | NULL 
3 | NULL | 201300 | NULL | NULL | NULL | NULL 
3 | NULL | NULL | 201304 | NULL | NULL | NULL 
3 | NULL | NULL | NULL | SALES | NULL | NULL 
3 | NULL | NULL | NULL | NULL | Y | NULL 
3 | NULL | NULL | NULL | NULL | NULL | Y 
orderno | variant | period_from | period_to | division | show_div | group_div 
3| AH003 | 201300 | 201304 | SALES | Y | Y 
+0

Вы должны предоставить подробную информацию о данных в orderreport. Вы ищете максимум этих значений и т. Д. У вас всегда будет только одна строка с ненулевым значением для этого столбца. Странно, что вы получаете несколько строк для одного заказа ... у вас есть несколько JOINS, которые не отображаются? –

+0

Если единственным выбором является одно значение или значение null, то вы можете применить любой min или max для исключения нулей. Но, как сказал Даррин, это некоторые забавные данные. – Andrew

ответ

5

Ваш запрос очень близко, я хотел бы добавить агрегатную функцию вокруг CASE-выражения, а затем GROUP BY:

SELECT orderno, 
    max(CASE WHEN param_id = 'variant' THEN param_val END) AS variant, 
    max(CASE WHEN param_id = 'period_from' THEN param_val END) AS period_from, 
    max(CASE WHEN param_id = 'period_to' THEN param_val END) AS period_to, 
    max(CASE WHEN param_id = 'division' THEN param_val END) AS division, 
    max(CASE WHEN param_id = 'show_div' THEN param_val END) AS show_div, 
    max(CASE WHEN param_id = 'group_div' THEN param_val END) AS group_div 
FROM orderreport 
group by orderno 
order by orderno 
+0

Это будет работать, только если для любого столбца имеется только одно ненулевое значение. Это довольно рискованное предположение. – Andrew

+2

@Andrew Это можно легко исправить, используя 'row_number()', так как это по существу PIVOT, вы можете получить результат несколькими способами. Это действительно зависит от данных и окончательного желаемого результата. Он имеет несколько возможных значений для любого из столбцов, а затем добавил row_number, и вы можете получить результат. – Taryn

+0

Я думаю, это моя точка, хотя, я не думаю, что мы знаем достаточно, чтобы предложить ответ еще – Andrew

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