行转列(动态列)

create table #
(
    id int identity,
    pid varchar(100),
    comid varchar(100)
)
insert #
select '001', 'a' union all
select '001', 'b' union all
select '002', 'b' union all
select '003', 'c' union all
select '003', 'd' union all
select '003', 'd' union all
select '004', 'f'
--SQL
declare @sql varchar(max)
set @sql = ''
select @sql = @sql + ',' + QUOTENAME(comid) from (select distinct comid from #) a
print @sql
set @sql = '
select * from
(select pid, pidcopy = pid, comid from #) a
pivot
(count(pidcopy) for comid in('+ STUFF(@sql, 1, 1, '') +')) b
'
print @sql
exec(@sql)

在MySQL中,将行转列并创建动态通常需要使用动态SQL动态SQL是指在执行时生成SQL语句的技术。以下是一个示例,展示如何将行转列并创建动态。 假设有一个名为`customer_orders`的,其中包含以下数据: ```plaintext +---------+----------+--------+ | order_id | customer | amount | +---------+----------+--------+ | 1 | John | 100 | | 2 | John | 200 | | 3 | Mary | 150 | | 4 | Mary | 300 | +---------+----------+--------+ ``` 要将每个客户的订单金额转换为动态,则可以使用以下示例代码: ```sql SET @sql = NULL;SELECT GROUP_CONCAT(DISTINCT CONCAT( 'SUM(IF(order_id = ''', order_id, ''', amount, 0)) AS `', order_id, '`' ) ) INTO @sql FROM customer_orders; SET @sql = CONCAT('SELECT customer, ', @sql, ' FROM customer_orders GROUP BY customer'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; ``` 执行上述代码后,将返回以下结果: ```plaintext +----------+-----+-----+-----+-----+ | customer | 1 | 2 | 3 | 4 | +----------+-----+-----+-----+-----+ | John | 100 | 200 | 0 | 0 | | Mary | 0 | 0 | 150 | 300 | +----------+-----+-----+-----+-----+ ``` 在上述示例中,首先使用`GROUP_CONCAT`和`CONCAT`函数生成动态SQL语句。然后,通过使用`SET`语句将动态SQL语句保存到变量`@sql`中。接下来,使用`PREPARE`语句准备该动态SQL语句,并使用`EXECUTE`语句执行该语句。最后,使用`DEALLOCATE PREPARE`释放该准备语句。 请注意,由于动态SQL的性质,这个方法可能会在处理大量数据时产生性能问题。因此,在实际应用中,请谨慎使用动态SQL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值