将SQL选择查询转换为以第一列作为标题,第二列作为行?

3

是否可以将第一列转换为表头,第二列转换为行?请参考下面的示例

   Type  | qty  (Header)
  Apple    4
  Orange   10
  Grapes   5


Apple | Orange | Grapes (Header)
4       10         5       

是MySQL还是SQL Server?在SQL Server中,您需要查看PIVOT。 - NYCdotNet
在SQL Server中,您可以使用pivot来实现这一点。 - syed mohsin
1
https://dev59.com/BHVD5IYBdhLWcg3wTZxm - NYCdotNet
你可以这样做,但是你必须在开始时知道结果将有多少列 - Joel Coehoorn
2个回答

1
-- 只是一些用于工作的样例。
create table #fruits ([type] varchar(10), quantity int)
insert into #fruits select  'Apple',4 union all select 'Orange', 10 union all select 'Grapes', 5

--首先获取唯一的[result]集合

declare @sqlStr varchar(max)

select @sqlStr = '['+ 
replace(
stuff((select distinct ','+[type] as [text()]
from #fruits s
    for xml path ('')) ,1,1,'')
    ,',','],[') + ']' 
from #fruits s1

select @sqlStr

--组装动态查询

declare @sqlStr1 varchar(max)
set @sqlStr1 = 'select *
from #fruits  a
pivot (sum (quantity) for [type] in ('+@sqlStr+')
    ) p'

-- 运行动态查询
 exec (@sqlStr1)    

希望这能有所帮助。
创建永久表的补充说明。
declare @sqlStr1 varchar(max)
set @sqlStr1 = 'IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[TblFruits]'') AND type in (N''U''))
DROP TABLE [dbo].[TblFruits]

select *
into TblFruits
from #fruits a
pivot (sum (quantity) for [type] in ('+@sqlStr+')
        ) p'

-- run dynamic query
 exec (@sqlStr1)  

如何在临时表中获取结果? 设置@sqlStr1 = 'select * into #temptable from #fruits a pivot (sum (quantity) for [type] in ('+@sqlStr+') ) p'。 #temptable不能在exec语句外访问。 - kalyanasundaram v
你好,我认为你不能这样做。如果你只是想将它与其他表连接起来,最好在动态查询中进行连接,但如果情况更加复杂,你需要在运行时创建永久表。我会在上面的答案中添加代码。请记住,我的回答可能不正确,也许有人会提出更好的解决方案。将其作为一个单独的问题提出来,看看会得到什么答案。 - user2065377

0
在SQL Server中,存在STUFF()和EXEC()函数来实现相同的动态查询。
select @script = STUFF( SELECT qty + ' AS ' + type + ', ' from table_orig);

EXEC (@script);

在MySql中,你可以使用EXECUTE:
SET @sqltxt = null;
SELECT GROUP_CONCAT(CONCAT( qty, ' AS ', type, ' ') ) INTO @sqltxt
FROM table_orig;

SET @sqltxt = concat('SELECT ', @sqltxt , ' FROM DUAL');

PREPARE stmt FROM @sqltxt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

祝你好运,


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接