gpt4 book ai didi

mysql - 将行值转置为列

转载 作者:行者123 更新时间:2023-11-29 02:27:39 25 4
gpt4 key购买 nike

我的查询很简单 - 它获取银行及其每月/每年的交易金额:

select bank_name, 
sum(payment_sum),
CONCAT(MONTH(payment_due_date), '/', YEAR(payment_due_date)) as month_year
from bank
join finance
on bank.bank_id = finance.bank_id
group by bank_name, month_year

返回:

enter image description here

如何将行值 (month_year) 转换为列,然后 payment_sum 也转换为对应的 month_year 生成的列?

我正在寻找一种方法来按月查找每家银行的付款总和。

我看了this主题,但我的需求似乎有所不同。

最佳答案

不幸的是,MySQL 没有将行转换为列的 PIVOT 函数,因此您需要使用带有 CASE 表达式的聚合函数。

如果列数有限或已知,查询的基本语法是:

select bank_name,
sum(case when month_year ='10/2011' then payment_sum else 0 end) `10/2011`,
sum(case when month_year ='11/2011' then payment_sum else 0 end) `11/2011`,
sum(case when month_year ='12/2011' then payment_sum else 0 end) `12/2011`
from
(
select bank_name,
payment_sum,
CONCAT(MONTH(payment_due_date), '/', YEAR(payment_due_date)) as month_year
from bank
join finance
on bank.bank_id = finance.bank_id
) d
group by bank_name;

但是对于你的情况,听起来你会有未知数量的日期,所以你可能需要使用准备好的语句来创建动态 sql:

SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'sum(case when month_year = ''',
CONCAT(MONTH(payment_due_date), '/', YEAR(payment_due_date)),
''' then payment_sum end) AS `',
CONCAT(MONTH(payment_due_date), '/', YEAR(payment_due_date)), '`'
)
) INTO @sql
from finance;

SET @sql
= CONCAT('SELECT bank_name, ', @sql, '
from
(
select bank_name,
payment_sum,
CONCAT(MONTH(payment_due_date), ''/'', YEAR(payment_due_date)) as month_year
from bank
join finance
on bank.bank_id = finance.bank_id
) d
group by bank_name;');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

关于mysql - 将行值转置为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18684390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com