首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Sql Server中编写转换语句

在Sql Server中编写转换语句
EN

Stack Overflow用户
提问于 2013-01-09 02:24:57
回答 1查看 10K关注 0票数 1

我正在将一个web应用程序后端从Access迁移到MSSQL,但是我无法在MSSQL中重现以下查询,你有什么想法吗?

代码语言:javascript
运行
复制
TRANSFORM First(FollowUp.FUData) AS FirstOfFUData
SELECT FollowUp.MRN
FROM FollowUp
GROUP BY FollowUp.MRN
PIVOT FollowUp.FU;

请注意,此查询将EAV表Followup中的数据转换为普通表。这是表Followup的设计

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-09 02:29:59

在SQL Server中,您可以使用PIVOT函数,您的查询将以这种方式设置:

代码语言:javascript
运行
复制
select MRN, Value1, Value2
from
(
  select MRN, FUData, FU
  from FollowUp
) src
pivot
(
  max(FUData)
  for FU in (Value1, Value2)
) piv

其中,您可以将Value1Value2等替换为您现在应为列的项的任意值。

SQL Server2008没有FIRST()函数,因此您必须使用另一个聚合函数或以这种方式查询数据才能返回FU中每一项的第一条记录。

另一种编写方法是将聚合函数与CASE语句一起使用:

代码语言:javascript
运行
复制
select MRN, 
  max(case when FU = 'value1' then FUData else null end) Value1,
  max(case when FU = 'value2' then FUData else null end) Value2
from FollowUp
group by MRN

如果您有一个已知数量的SQL值要转换为列,那么上面的版本将非常有效,但是如果您没有这样做,那么您将需要使用如下所示的动态FU

代码语言:javascript
运行
复制
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(FU) 
                    from FollowUp
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT MRN,' + @cols + ' from 
             (
                select MRN, FUData, FU
                from FollowUp
            ) x
            pivot 
            (
                max(FUData)
                for FU in (' + @cols + ')
            ) p '

execute(@query)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14221593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档