SQL заявление с группой по - PullRequest
       7

SQL заявление с группой по

0 голосов
/ 14 сентября 2009

после очень длинного SQL-запроса может иметь следующий результат:

 col1 | col2 | col3 | col4
------+------+------+-----
1234  | 1    | aaaa | bbbb
2378  | 0    | aaaa | bbbb
9753  | 1    | cccc | uuuu
1234  | 0    | iiii | yyyy
2378  | 1    | iiii | yyyy
9753  | 1    | tttt | mmmm

но мне это не нужно. я должен сделать еще один SQL-оператор по этому результату, где я должен использовать group третий и четвертый столбец. другими словами, две строки в одной, например:

col1 | col2 | col3 | col4 | col5 | col6
-----+------+------+------+------+-----
1234 | 1    | 2378 | 0    | aaaa | bbbb
1234 | 1    | 2378 | 0    | aaaa | bbbb
9753 | 1    | null | null | cccc | uuuu
1234 | 0    | 2378 | 1    | iiii | yyyy
9753 | 1    | null | null | tttt | mmmm

Ответы [ 3 ]

2 голосов
/ 14 сентября 2009

Эту проблему можно решить, создав две дополнительные таблицы (временные или нет, в зависимости от ваших требований и механизма SQL), структура которых будет отображать столбцы из запроса.

Например:

CREATE TABLE TableA (
  Col1 int,
  Col2 bit,
  Col3 varchar(4),
  Col4 varchar(4)
)

CREATE TABLE TableB (
  Col1 int,
  Col2 bit,
  Col3 varchar(4),
  Col4 varchar(4)
)

Обратите внимание, что это только примерная структура, основанная на представленных вами выходных данных.

После создания этих двух таблиц вам потребуется вставить данные из запроса в каждую из таблиц.

Добавлено: Вам не нужно выполнять один и тот же запрос дважды. Выполните его один раз, поместите данные в TableA, затем выполните SELECT для TableA и поместите данные в TableB. Это сэкономит вам много времени.

Последним шагом будет выполнение запроса к TableA и TableB с JOIN для их столбцов Col3 и Col4. Примерно так:

SELECT A.Col1, A.Col2, B.Col1, B.Col2, COALESCE(A.Col3, B.Col3), COALESCE(A.Col4, B.Col4)  
FROM TableA A INNER JOIN TableB B ON A.Col3 = B.Col3 AND A.Col4 = B.Col4

Надеюсь, это поможет.

Также имейте в виду, что у этого решения есть один существенный недостаток:

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

После редактирования (вы предоставили дополнительные NULLS в выходных данных):

Если вы хотите сохранить значения NULL, вам следует использовать другое объединение, например: LEFT OUTER JOIN

Другие возможные решения:

  1. Просто замените (SELECT * FROM dbo.Test) длинным запросом. Однако это приведет к тому, что запрос будет выполнен дважды.

    ВЫБРАТЬ A. *, B. * ИЗ (ВЫБРАТЬ * ИЗ dbo.Test) ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ * ИЗ dbo.Test) B ВКЛ A.Col3 = B.Col3 AND A.Col4 = B.Col4 AND A.Col1 <> B.Col1 И A.Col2 <> B.Col2

  2. Если вы используете SQL 2005, вы можете попробовать использовать оператор CROSS APPLY.

Могут быть и другие решения, но вы должны более подробно описать используемый движок SQL и свои права на базу данных.

1 голос
/ 14 сентября 2009

Хм,

Я бы выбросил результат во временную таблицу. Тогда сделай

select 
a.col1, 
a.col2, 
b.col1,
b.col2,
coalesce(a.col3, b.col3) as col5, 
coalesce(a.col4,b.col4) as col6 
from #tmp a 
outer join #tmp b 
on a.col3 = b.col3 and a.col4 = b.col4 
where a.col2 = 0 and b.col2 = 1

Конечно, предполагается, что col2 является индикатором того, какая часть пары у вас есть.

0 голосов
/ 14 сентября 2009

я нашел правильное решение, основываясь на первом решении @Wodzu.

во-первых, создайте временное представление, которое будет содержать результат.

с tmp как ( - мое очень длинное заявление sql ... )

во-вторых, сделайте выбор, так как их два, таким образом, запрос вызывается только один раз.

выберите a. **, b. ** из tmp для внутреннего соединения tmp b по условиям.

Спасибо Водзу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...