Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中一对多连接新列_Sql_Mysql_Pivot - Fatal编程技术网

在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);

嗯,至少现在我知道我为什么找不到答案了,哈哈。嗯,至少现在我知道我为什么找不到答案了,哈哈。