2013-10-11 7 views
0

Я хотел бы объединить некоторые результаты из SQL-запроса. Чтобы применить ограничение, некоторые строки должны быть удалены при добавлении некоторых значений в другую строку. Количество строк, которые должны быть объединены, изменяется. Это трудно объяснить, так вот пример, чтобы показать, что я имею в виду:Объединение строк из запроса SQL SELECT

Same values | 1 | Date | City 
Same values | 2 | Date | City 
Same values | 3 | Date | City 

Это должны быть преобразованы в нечто вроде этого:

Same values | Date1 | City1 | Date2 | … 

Итак, я в основном хочу получить доступ ко всем данным как можно проще. У вас есть простое решение?

+0

С переменным числом столбцов? № –

+3

Есть сотни вариантов этого вопроса с ответами, если вы ищете SO для [PIVOT SQLite] (http://stackoverflow.com/search?q=Pivot+SQLite). Вы должны быть в состоянии найти то, что вам нужно там. – GarethD

+0

Нет ... Я знаю, что переменные невозможны. Это просто пример, объясняющий мою проблему. – Niklas

ответ

0

Предполагая, что ваш стол, как так (я добавил имена столбцов):

A   | B | C  | D 
------------+---+----------+------ 
Same values | 1 | 20130101 | City1 
Same values | 2 | 20130102 | City2 
Same values | 3 | 20130103 | City3 

Ваш запрос будет:

SELECT A, 
     MAX(CASE WHEN B = 1 THEN C END) C1, 
     MAX(CASE WHEN B = 1 THEN D END) D1, 
     MAX(CASE WHEN B = 2 THEN C END) C1, 
     MAX(CASE WHEN B = 2 THEN D END) D1, 
     MAX(CASE WHEN B = 3 THEN C END) C1, 
     MAX(CASE WHEN B = 3 THEN D END) D1 
FROM T 
GROUP BY A; 

Example On SQL Fiddle

Что дает:

A   | C1  | D1 | C1  | D1 | C1  | D1 
-------------+-----------+--------+----------+--------+----------+-------- 
Same values | 20130101 | City1 | 20130102 | City2 | 20130103 | City3 

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

Таким образом, вы должны были бы получить максимальное значение B:

SELECT MAX(B) B FROM T; 

Затем цикл через 1 до максимального значения В (я не знаю, какой язык вы используете, но в C# как это это то, что я использую сегодня):

var sb = new StringBuilder(); 
var template = ", MAX(CASE WHEN B = {0} THEN C END) C{0}, MAX(CASE WHEN B = {0} THEN D END) D{0}"; 
sb.Append("SELECT A"); 

for (int i = 1; i < MaxB; i++) { 
    sb.Append(string.Format(template, i); 
} 
sb.Append(" FROM T GROUP BY A"); 
Смежные вопросы