在MySQL中一对多连接新列
前几天我问了一个类似的问题,但似乎没有人能回答,在互联网上搜索了几天,但仍然没有结果,也许我问的问题不对:在MySQL中一对多连接新列,sql,mysql,pivot,Sql,Mysql,Pivot,前几天我问了一个类似的问题,但似乎没有人能回答,在互联网上搜索了几天,但仍然没有结果,也许我问的问题不对: 所以我会再试一次,也许用不同的词来表达。这基本上是我试图做的一个简化版本: CREATE TABLE Customer( customer_id INT NOT NULL, first_name varchar(20), last_name varchar(20) ); CREATE TABLE Payment( customer_id INT NOT NULL,
所以我会再试一次,也许用不同的词来表达。这基本上是我试图做的一个简化版本:
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)
);
我想要的是在左边组织第一个_名称,只出现一次,然后每年在单独的列中列出付款金额,因为我要将其附加到WPF,我想要数据的电子表格样式表示。因此,理想的情况是:
name 2009 2008 2007
John 500 600 NULL
Anne NULL 500 600
Bob NULL NULL 600
我的方法是计算不同年份的付款数量,并将其用作循环计数器。然后循环并收集每年的数据。表示按年份编号支付的每列金额。我不仅不知道如何做到这一点,因为我最初的方法是使用UNION,但后来我意识到这只是将所有内容放在同一列,而不是单独列。那么我应该用什么呢?我只是要求一些指导。谢谢大家! mysql不幸没有
pivot
功能,因此唯一可能的方法是使用任何编程语言格式化结果集。mysql不幸没有pivot
功能,因此唯一可能的方法是使用任何编程语言格式化结果集。使用:
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
使用:
我没有测试过它,但我认为类似的方法是可行的:
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);
我没有测试过它,但我认为类似的方法是可行的:
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);
嗯,至少现在我知道我为什么找不到答案了,哈哈。嗯,至少现在我知道我为什么找不到答案了,哈哈。