2014-12-14 3 views
1

У меня есть 3 таблицы, это Sql Fiddle Demo http://www.sqlfiddle.com/#!15/89ac5/3/0Показать те же столбцы с различными значениями в одном ряду

create table entities (id int, credit int, debit int, value int,etype int, date date); 

insert into entities values 
    (1,101,100,5000,1,'01/01/2014'), 
    (1,101,100,1000,2,'01/01/2014'), 
    (1,102,100,2000,1,'01/01/2014'), 
    (1,102,100,4000,2,'01/01/2014'); 

create table accounts (id int, name varchar(20)); 

insert into accounts values 
    (100, 'Clinic'), 
    (101, 'Mark'), 
    (102, 'Jone'); 

create table etype (id int, name varchar(20)); 

insert into etype values 
    (1, 'Medicine'), 
    (2, 'Diagnoise'); 

, когда я запустить этот запрос:

select 
    e.id, 
    credit_account.name as CreditName, 
    debit_account.name as DebitName, 
    t.name,  
    e.date 
from entities e 
join accounts as credit_account on e.credit = credit_account.id 
join accounts as debit_account on e.debit = debit_account.id 
Join etype as t on e.etype = t.id 

I имеют следующий результат:

ID CREDITNAME DEBITNAME VALUE NAME DATE 
1   Mark  Clinic 5000 Medicine January, 01 2014 00:00:00+0000 
2   Mark  Clinic 1000 Diagnoise January, 01 2014 00:00:00+0000 
3   Jone  Clinic 2000 Medicine January, 01 2014 00:00:00+0000 
4   Jone  Clinic 4000 Diagnoise January, 01 2014 00:00:00+0000 

наконец, я хочу посмотреть, чтобы показать этот результат:

ID CREDITNAME DEBITNAME Medicine Diagnoise DATE 
1   Mark  Clinic 5000  1000  January, 01 2014 00:00:00+0000 
2   Jone  Clinic 2000  4000  January, 01 2014 00:00:00+0000 

, если мы можем сделать его Динамически, если мы добавим «Lab»

+0

Где делает 'колонки ID' приходят из в ожидаемых результатах? –

+0

- это значение идентификатора от сущностей? –

+0

нет, не заботятся об id не важно идентификатор с вывода – user3614504

ответ

0

Вы можете использовать условную агрегацию:

select row_number() over (order by creditname, debitname) as id, creditname, debitname, 
     sum(case when name = 'Medicine' then value end) as medicine, 
     sum(case when name = 'Diagnoise' then value end) as diagnoise, 
     date 
from table t 
group by creditname, debitname, date; 

EDIT:

на основании вашего д uery:

select row_number() over (order by creditname, debitname) as id, 
     credit_account.name as CreditName, 
     debit_account.name as DebitName, 
     sum(case when t.name = 'Medicine' then e.value end) as medicine, 
     sum(case when t.name = 'Diagnoise' then e.value end) as diagnoise, 
     e.date 
from entities join 
    accounts credit_account 
    on e.credit = credit_account.id join 
    accounts debit_account 
    on e.debit = debit_account.id Join 
    etype t 
    on e.etype = t.id 
group by credit_account.name, debit_account.name, e.date 
+0

@a_horse_with_no_name. , , Спасибо. Я полностью пропустил этот тег. –

0

Вы можете сделать:

select distinct 
    e.id, 
    credit_account.name as CreditName, 
    debit_account.name as DebitName, 
    (select e1.value 
    from entities e1 
    where e1.etype = 1 //Medicine type 
    and e1.credit = e.credit) as Medicine, 
    (select e1.value 
    from entities e1 
    where e1.etype = 2 //Diagnoise type 
    and e1.credit = e.credit) as Diagnoise, 
    e.date 
from entities e 
join accounts as credit_account on e.credit = credit_account.id 
join accounts as debit_account on e.debit = debit_account.id 

Конечно, если вы не хотите, чтобы жёстко типы с 1 и 2 вы можете изменить подзапросы с:

select e1.value 
from entities e1, etypes et 
where e1.etype = et.id 
and et.name = 'Medicine' 
and e1.credit = e.credit 

Но я не думаю, что это лучший способ сделать это.

0

спасибо, ребята, я сделал некоторые изменения для запроса:

select 
    credit_account.name as CreditName, 
    debit_account.name as DebitName, 
    sum(case when t.name = 'Medicine' then e.value end) as medicine, 
    sum(case when t.name = 'Diagnoise' then e.value end) as diagnoise,  
    e.date 
from entities e 
join accounts as credit_account on e.credit = credit_account.id 
join accounts as debit_account on e.debit = debit_account.id 
Join etype as t on e.etype = t.id 
group by credit_account.name, debit_account.name, e.date