2013-08-01 3 views
1

У меня есть таблица в базе данных SQL Server 2008 с тремя столбцами: dt, indx_nm и indx_valSQL Регистрация В той же таблице на основе сопоставления значений

Когда я бегу:

SELECT * 
FROM table1 a 
WHERE a.indx_nm = 'ABQI' OR a.indx_nm = 'ACNACTR' 
ORDER BY indx_nm, dt 

я получаю что-то как (просто выбрать случайное 8 из 3000 значений)

# dt--------------indx_nm----------------indx_val 
    2009-06-08---------ABQI------------------1001.25 
    2009-06-09---------ABQI------------------1002.12 
    2010-06-08---------ABQI------------------928.76 
    2011-06-10---------ABQI------------------959.97 
    2009-06-08--------ACNACTR----------------300.05 
    2009-06-09--------ACNACTR----------------341.19 
    2010-04-08--------ACNACTR----------------428.26 
    2011-07-10--------ACNACTR----------------509.48 

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

# dt---------indx_nm1-----indx_val1-------indx_nm2------indx_val2 
    2009-06-08----ABQI------1001.2------------ACNACTR----------300.05 
    2009-06-09----ABQI------1002.12 ----------ACNACTR----------341.19 

По существу соответствующий общие даты между индексами, а затем присоединением к другому indx_nm и его соответствующего indx_val к результату?

* добавление

так им пытаются найти ковариации между ABQI и ACNACTR. Я знаю, что я мог бы взять среднее значение всего indx_val1 'и среднее значение всего index_val2, но есть способ, которым я мог бы перебирать весь набор из 1000+ строк для каждого значения indx_val1 и indx_val2 для ввода в (xi-x) (у-у)/п
я мог, вероятно, делает это на УВА более легко, но я не думаю, что он сможет справиться с этим (я сотни indx_nm, что я хотел бы определить ковариация)

+1

Чтобы отформатировать блок кода, запишите его и 'ctl-k' или щелкните по кнопке' {} 'редактора или отступом 4 пробела. Нет необходимости в '
' тегах. –

+1

Будет ли неопределенный набор значений, таких как 'ABQI, ACNACTR', или это всегда определенный набор, к которому вы будете запрашивать? –

+0

Это конкретный известный набор – euge1220

ответ

2

Для этого вы можете GROUP BY dt, и с комбинацией агрегата MAX() и CASE верните правильные столбцы при свертывании нескольких строк с NULL в одну строку.

SELECT 
    dt, 
    MAX(CASE WHEN indx_nm = 'ABQI' THEN indx_nm ELSE NULL END) AS indx_nm1, 
    MAX(CASE WHEN indx_nm = 'ABQI' THEN indx_val ELSE NULL END) AS indx_val1, 
    MAX(CASE WHEN indx_nm = 'ACNACTR' THEN indx_nm ELSE NULL END) AS indx_nm2, 
    MAX(CASE WHEN indx_nm = 'ACNACTR' THEN indx_val ELSE NULL END) AS indx_val2 
FROM table1 a 
GROUP BY dt 
ORDER BY dt 

Вот демо: http://sqlfiddle.com/#!6/2ec65/1

Без MAX() агрегатов, вы бы в конечном итоге с двумя рядами для каждого значения dt где либо ABQI или ANACTR пары NULL. Затем агрегат MAX() выбирает «наибольший» из нулевого и ненулевого значения, в результате чего одна группа сгруппирована по dt.

Теперь, если вы хотите, чтобы вернуть только эти значения для dt, которые имеют как из indx_nm заселенной (без NULL ов), вы можете просто обернуть выше в подзапрос:

SELECT * FROM (
    SELECT 
     dt, 
     MAX(CASE WHEN indx_nm = 'ABQI' THEN indx_nm ELSE NULL END) AS indx_nm1, 
     MAX(CASE WHEN indx_nm = 'ABQI' THEN indx_val ELSE NULL END) AS indx_val1, 
     MAX(CASE WHEN indx_nm = 'ACNACTR' THEN indx_nm ELSE NULL END) AS indx_nm2, 
     MAX(CASE WHEN indx_nm = 'ACNACTR' THEN indx_val ELSE NULL END) AS indx_val2 
    FROM table1 a 
    GROUP BY dt 
) indxs 
WHERE 
    /* Discard those rows where either pair is NULL */ 
    indx_nm1 IS NOT NULL 
    AND indx_nm2 IS NOT NULL 
ORDER BY dt 

Редактировать Ой, что ошибочный пункт WHERE не должен был быть там.

+0

@ euge1220 Вы протестировали запрос внизу? Вот что он делает. http://sqlfiddle.com/#!6/2ec65/8 –

+0

Да, я только что опубликовал, что до того, как увидел редактирование, спасибо! – euge1220

+0

o im пытается найти ковариацию между ABQI и ACNACTR. Я знаю, что я мог бы взять среднее значение всего indx_val1 и среднего значения всего index_val2, но есть ли способ, которым я мог бы перебирать весь набор из 1000+ строк для каждого значения indx_val1 и indx_val2 для ввода в (xi-x) (yi-y)/n Я мог бы сделать это на vba более легко, но я не думаю, что он сможет справиться с этим (у меня есть сотни indx_nm, которые я бы хотел определить ковариация) – euge1220

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