2010-08-11 63 views
1

前幾天我問了一個類似的問題,但似乎沒有人能夠回答它,並在網上搜索了幾天,但仍然沒有結果,也許我沒有問提問正確的方法:One-to-many Query in MySQL
所以,我再試一次,也許有點不同。這基本上是什麼,我試圖做一個簡化版本:在MySQL中加入新列一對多

CREATE TABLE Customer( 
customer_id INT NOT NULL, 
first_name varchar(20), 
last_name varchar(20) 
); 
CREATE TABLE Payment( 
customer_id INT NOT NULL, 
amount_paid INT, 
year YEAR, 
FOREIGN KEY (customer_id) REFERENCES Customer(customer_id) 
); 

我想是組織左側的FIRST_NAME,只發生一次,然後每年列表中的付款金額中單獨列,因爲我將附加到WPF,我想要一個數據的電子表格樣式表示。因此,理想的情況下應該是這樣的:

name 2009 2008 2007 
John 500 600 NULL 
Anne NULL 500 600 
Bob NULL NULL 600 

我的方法是計算不同年費的次數,並用其作爲一個循環計數器。比循環和收集每年的數據。以年份編號表示amount_paid的每一列。我不是不知道該怎麼做,因爲我最初的方法是使用UNION,但是我意識到只是將所有內容放在同一列而不是單獨列。那麼我應該使用什麼?我只是要求一些指導。謝謝!

回答

1

用途:

SELECT c.first_name, 
     MAX(CASE WHEN p.year = 2009 THEN c.amount_paid ELSE NULL END) AS 2009, 
     MAX(CASE WHEN p.year = 2008 THEN c.amount_paid ELSE NULL END) AS 2008, 
     MAX(CASE WHEN p.year = 2007 THEN c.amount_paid ELSE NULL END) AS 2007 
    FROM CUSTOMER c 
    JOIN PAYMENT p ON p.customer_id = c.customer_id 
GROUP BY c.first_name 
+0

太美了!非常感謝你,我的大腦現在可以休息了。 – MCH 2010-08-11 21:30:37

0

mysql不幸沒有pivot功能,所以唯一可能的方法是用任何編程語言格式化結果集。

+0

好,起碼現在我知道爲什麼我無法找到答案, 哈哈。 – MCH 2010-08-11 21:13:03

0

我沒有測試,但我認爲像這樣的工作:

select * from ((select name, sum(amount_paid) as 2009 from customer, payment 
where customer.customer_id = payment.customer_id 
and payment.year = 2009) a, 
(select name, sum(amount_paid) as 2008 from customer, payment 
where customer.customer_id = payment.customer_id 
and payment.year = 2008) b 
(select name, sum(amount_paid) as 2007 from customer, payment 
where customer.customer_id = payment.customer_id 
and payment.year = 2007) c);