2015-03-05 4 views
0

В таблице, в которой я работаю, используются две строки для записи каждой транзакции: одна строка для идентификации стороны, вторая строка для идентификации стороны, на которую воздействует. Содержимое данных отличается только значением одного поля, логическим значком «Y» или «N». Например, я мог бы это:SQL, чтобы объединить две записи в одну

E-num E-date  Client Actor 
1234 2013-05-02 ACME  Y 
1234 2013-05-02 ALLIED N 

Что я хотел бы сообщить это:

E-num E-date  For  Against 
1234 2013-05-02 ACME  ALLIED 

Спасибо, ребята. Терри

+2

Что RDBMS вы используете? Лучший ответ зависит от того, являются ли это MySQL, SQL-Server, Oracle и т. Д. – Barmar

+0

@Barmar Вы правы, из. Заголовок говорит SQL, тег говорит SQL, но из-за «1» сообщения и самого вопроса я бы предсказал * MySQL * как RDBMS :-) – dognose

+0

Да, я мог бы быть более конкретным. Это был/- Oracle 11g. –

ответ

1

просто присоединитесь к таблице на E-num и выберите строки по мере необходимости.

Если вы используете MySQL, то запрос будет

SELECT 
    t1.E-num, 
    t1.E-date, 
    t1.Client AS 'For', 
    t2.Client AS Against 
    FROM 
    `transaction` t1 
    INNER JOIN 
    `transaction` t2 
    ON 
    t1.E-num = t2.E-num 
    WHERE 
    t1.Actor = 'Y' AND 
    t2.Actor = 'N' 

Untest, но это должно дать вам идею.

+0

Работает как очарование. Большое спасибо, дознай! –

+0

@TerrenceBranscombe Добро пожаловать. – dognose

+0

Обратите внимание, что это не совместимо с Oracle 11g. '-' не работает в именах столбцов, если вы не заключили его в' '' ', и включение' transaction' с '' '' также неверно. Наконец, есть ';' missing, 'For' должен быть заключен в' '', и дата не была рассмотрена. – Trinimon

0

Версия ORACLE: использовать автообъединение Вашего стола:

SELECT t1."E-num", t1."E-date", t1."Client" as "For", t2."Client" as "Against" 
    FROM transaction t1, transaction t2 
WHERE t1."E-num" = t2."E-num" 
    AND t1."E-date" = t2."E-date" 
    AND t1."Actor" = 'Y' 
    AND t2."Actor" = 'N'; 
+0

Спасибо за идею, Тринимон. –

0

Вы можете использовать стержень для этого ...

with t as (
    select [E-num] = 1234, [E-date] = '5/2/2013', [Client] = 'ACME', Actor = 'Y' 
    union select 1234, '5/2/2013', 'ALLIED', 'N' 
) 

select 
    p.[E-num], 
    p.[E-date], 
    [For] = p.[Y], 
    [Against] = p.[N] 
from 
    t 
    pivot (
     max(Client) 
     for Actor in ([Y],[N]) 
    ) p 
+0

Путь над моей головой, но спасибо за ответ, dotjoe. –