2012-05-31 37 views
1

我有一個稱爲日誌的表。 雜誌有4列:JOIN 2從一個表中選擇查詢

  1. 日期(日期)
  2. 帳戶(INT)
  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列中填充了Amount的值,無論它們是否爲null。

+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 ...這正是我想要的,你只是碰上了頭......但還有一件事..如何鏈接到一個名爲Accounts的父表日記帳表上的列等於帳戶表上的ID,在其他帳戶上獲取帳戶名稱。 – 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] 

這將對日期/賬戶組合的每個值的金額進行求和。你可以用你的選擇(MINMAX等)的任何骨料代替SUM

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