2012-05-10 4 views
1

Вот мой SQL таблицы:Показать строки в столбцы

Table1 
Col1 Col2 
a  1 
a  2 
a  3 
b  1 
c  1 
c  2 

Как я могу запросить эту таблицу, чтобы увидеть, как это?

col1,value1,value2,value3 
a,1,2,3 
b,1,null,null 
c,1,2,null 

Каждое значение в col1 никогда не будет содержать более 5 записей. Я не знаю, какие значения находятся в col2, они будут динамическими.

+0

Почему бы не использовать php или другие языки для выполнения таких задач? –

+2

Терминологическая проблема: запрос SQL Server ничего не отображает. Он возвращает набор результатов, который позже может отображаться программным обеспечением для потребления. –

+0

Как сказал Джон, вам придется запросить таблицу, чтобы получить набор результатов, а затем сопоставить это с каким-то объектом, который может это отразить. В этом случае образцом объекта будет то, что содержит переменную типа COL1, а список типов Col2 - это карта с ключом типа col1 и значением, которое является списком, который вы обновляете при встрече с этим ключом – Dennis

ответ

0

Базы данных не очень хорошо выполняют то, что вы просите. Хотя я уверен, что это возможно, и что кто-то опубликует решение здесь, возможно, вы могли бы облегчить свою жизнь с помощью небольшого сценария bash.

Этот код получает список всех уникальных значений в столбце 1. Затем он запрашивает таблицу для всех значений в столбце 2 для заданного значения в столбце 1. Команда «tr» заменяет символы новой строки запятыми и команда sed переключает последнюю запятую обратно на символ новой строки.

У меня возникает ощущение, что если вы разместите больше информации о своей конкретной проблеме, возможно, это будет лучшее решение для вашей проблемы. Любое решение, являющееся чистым запросом, будет связано с привязкой таблицы к себе 5 раз, что может потребовать много обработки в зависимости от размера вашей таблицы.

Примечание: Я сделал пару предположений, так как вопрос не имел деталей. Я предположил, что мы используем postgresql и что база данных называется test.

#!/bin/bash                  

echo "select distinct col1 from table1 order by col1" | psql -At test | while read col1;do 
    echo -n "$col1," 
    echo "select col2 from table1 where col1='$col1' order by col2" | psql -At test | tr '\n' ',' | sed s/,$/\n/' 

done 

Выход затем:

a,1,2,3 
b,1 
c,1,2 
3

Если вы используете SQL 2005 или более поздней версии, PIVOT является хорошим вариантом. Для статических запросов, то можно предположить, что максимальное число значений 1, 2, 3 ... и использовать PIVOT, как это:

SELECT Col1 AS 'Col1', 
[1], [2], [3], [4], [5] 
FROM 
(SELECT Col1, Col2 
    FROM dbo.Table1) AS SourceTable 
PIVOT 
(
MAX(Col2) 
FOR Col2 IN ([1], [2], [3], [4], [5]) 
) AS PivotTable; 

Если вы принимаете динамический SQL, вы можете создать оператор SQL и выполнить он использует sp_executesql:

DECLARE @Values VARCHAR(1000) 
DECLARE @SQL NVARCHAR(MAX) 
SET @Values = NULL 

SELECT 
    @Values = COALESCE(@Values + ', ', '') + + '[' + CAST(Col2 AS VARCHAR) + ']' 
FROM (SELECT DISTINCT TOP 100 PERCENT Col2 FROM dbo.Table1 ORDER BY 1) T 

SET @SQL = ' 
SELECT Col1 AS ''Col1'', 
' + @Values + ' 
FROM 
(SELECT Col1, Col2 
    FROM dbo.Table1) AS SourceTable 
PIVOT 
(
MAX(Col2) 
FOR Col2 IN (' + @Values + ') 
) AS PivotTable; 
' 
EXECUTE sp_executesql @SQL 
Смежные вопросы