2012-05-31 6 views
1

У меня есть одна таблица, называемая журналом. Журнал имеет 4 колонки:JOIN 2 select queries FROM ONE TABLE

  1. Дата (даты)
  2. Account (интермедиат)
  3. типа (VARCHAR (1) (Может принимать символы D или C)
  4. Сумма (десятичные (18,2))

ЖУРНАЛ

Date   Account Amount Type 
2012-05-31 20001  300  D 
2012-05-31 20002  700  C 
2012-05-31 20003  600  D 
2012-05-31 20004  900  C 

Колонка типа может принимать только 2 типа символьных значений: D или C. Так я нужен запрос, который даст мне 4 колонки, таким образом, что результирующие столбцы:

Date  Account  D  C 
2012-05-31 200101  300  0 
2012-05-31 200102  0  700 
2012-05-31 200103  600  0 
2012-05-31 200104  0  900 

с D и C столбцы, заполненные значениями из суммы, являются ли они нулевыми или нет.

+0

Какую базу данных вы используете? Некоторые из них имеют ключевое слово PIVOT для такого рода вещей. –

+0

@amit sql server – froodo

ответ

3

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

create table journal 
(
    date datetime, 
    account int, 
    amount money, 
    type varchar(1) 
) 

insert into journal values ('05/31/12', 20001, 300, 'D') 
insert into journal values ('05/31/12', 20002, 700, 'C') 
insert into journal values ('05/31/12', 20003, 600, 'D') 
insert into journal values ('05/31/12', 20004, 900, 'C') 

select date 
    , account 
    , isnull([D], 0) as D 
    , isnull([C], 0) as C 
from 
(
    select * 
    from journal 
) x 
pivot 
(
    sum(amount) 
    for type in ([D], [C]) 
) p 

drop table journal 

Смотрите SQL Fiddle с демо

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

select date 
    , account 
    , name 
    , isnull([D], 0) as D 
    , isnull([C], 0) as C 
from 
(
    select * 
    from journal j 
    inner join account a 
     on j.account = a.id 
) x 
pivot 
(
    sum(amount) 
    for type in ([D], [C]) 
) p 
+0

@bluefeet ... это именно то, что я хочу, вы просто нажмете гвоздь на голове ..... но еще одна вещь .. как бы я ссылаюсь на родительскую таблицу, называемую учетными записями, где учетная запись столбец таблицы журналов равен ID в таблице Accounts, в другом - для получения имени учетной записи. – froodo

+0

@froodo Я обновил свой ответ, вы захотите добавить соединение для другой таблицы. – Taryn

+0

@bluefeet ... да, но в этом запросе я сделаю запрос на соединение, так как это первый раз, когда я вижу синтаксис или инструкцию ** PIVOT **. – froodo

0

Вы пытаетесь сделать что-то подобное?

SELECT 
    SUM(CASE [Type] WHEN 'C' THEN [Amount] ELSE 0 END) AS C 
    ,SUM(CASE [Type] WHEN 'D' THEN [Amount] ELSE 0 END) AS D 
    ,[Date] 
    ,[Account] 
FROM 
    Journal 
GROUP BY 
    [Date] 
    ,[Account] 

Это суммирует сумму каждого значения для комбинации даты/счета. Можно заменить SUM агрегат с любым агрегатом по вашему выбору (MIN, MAX и т.д.)

1
SELECT DATE, 
     account, 
     CASE 
     WHEN TYPE = 'D' THEN 
      amount 
     ELSE 
      0 
     END D, 
     CASE 
     WHEN TYPE = 'C' THEN 
      amount 
     ELSE 
      0 
     END C TYPE 
    FROM JOURNAL 
+0

@mcha ... это тоже работает ... спасибо – froodo

+0

Я должен был взять слово «тип», но тогда он работал нормально. Я просто вырезал и вложил его в скрипку сверху. – mikeY