首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重新格式化SQL输出

重新格式化SQL输出
EN

Stack Overflow用户
提问于 2019-06-14 12:37:23
回答 3查看 77关注 0票数 0

我有如下所示的数据

代码语言:javascript
复制
Name  XX YY
alpha 10 77
beta  10 90
alpha 20 72
beta  20 91
alpha 30 75
beta  30 94
alpha 40 76
beta  40 95

如果我使用

代码语言:javascript
复制
select * from scores order by Name, XX

我会得到

代码语言:javascript
复制
Name  XX YY
alpha 10 77
alpha 20 72
alpha 30 75
alpha 40 76
beta  10 90
beta  20 91
beta  30 94
beta  40 95

目前,我正在检索此表单中的数据,并使用一些C代码将其格式化为

代码语言:javascript
复制
Name   xx=10  xx=20  xx=30  xx=40
alpha  77     72     75     76
beta   90     91     94     95

假设每个名字总是有10、20、30、40个条目,这在SQL中是可能的,而不需要像在SQL Reformatting table columns中那样创建一个新表。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-14 12:54:25

你需要使用PIVOT来获得你想要的结果。在使用PIVOT之前,需要对列XX中的值进行一些自定义,以便最终的列输出可以满足您的期望。

代码语言:javascript
复制
SELECT * FROM
(
SELECT Name,'XX='+CAST(XX AS VARCHAR) XX,YY 
FROM your_table
)AS P
PIVOT(
    SUM(YY)
    FOR XX IN ([XX=10],[XX=20],[XX=30],[XX=40])
) PP

输出-

代码语言:javascript
复制
Name    XX=10   XX=20   XX=30   XX=40
alpha   77      72      75      76
beta    90      91      94      95

使用以下查询也可以获得相同的输出:

代码语言:javascript
复制
SELECT Name,
[10] AS [XX=10],
[20] AS [XX=20],
[30] AS [XX=30],
[40] AS [XX=40]
FROM
(
    SELECT Name, XX,YY 
    FROM your_table
)AS P
PIVOT(
    SUM(YY)
    FOR XX IN ([10],[20],[30],[40])
) PP
票数 3
EN

Stack Overflow用户

发布于 2019-06-14 13:38:30

您可以使用dynamic PIVOT来实现相同的结果,这将更加健壮,

代码语言:javascript
复制
CREATE TABLE #table1 (Name varchar(100), XX INT, YY INT)

INSERT INTO #table1 VALUES
('alpha',10,77),
('beta',10,90),
('alpha',20,72),
('beta',20,91),
('alpha',30,75),
('beta',30,94),
('alpha',40,76),
('beta',40,95)

DECLARE @pvt NVARCHAR(MAX) = '';
DECLARE @dynamicCol NVARCHAR(MAX) = '';

SELECT @pvt +=  ', ' +QUOTENAME([XX]) FROM #table1 GROUP BY [XX];
SELECT @dynamicCol +=  ', ' +QUOTENAME([XX]) + ' AS ' + QUOTENAME('XX=' + CAST([XX] AS VARCHAR(25))) FROM #table1 GROUP BY [XX];
SET @pvt = STUFF(@pvt,1,1,'')
SET @dynamicCol = STUFF(@dynamicCol,1,1,'')

EXEC ('
SELECT [Name],' + @dynamicCol+'
FROM #table1 a
PIVOT 
(
  SUM([YY])
  FOR [XX] IN ('+ @pvt+')
) PIV');

结果如下:

代码语言:javascript
复制
Name    XX=10   XX=20   XX=30   XX=40
alpha   77      72      75      76
beta    90      91      94      95
票数 1
EN

Stack Overflow用户

发布于 2019-06-14 13:06:11

使用case的另一个解决方案

代码语言:javascript
复制
SELECT Name
  ,SUM(CASE when XX = '10' then YY else 0 END) AS 'xx=10'
  ,SUM( CASE when XX = '20' then YY else 0 END) AS 'xx=20'
  ,SUM( CASE when XX = '30' then YY else 0 END) AS 'xx=30'
  ,SUM( CASE when XX = '40' then YY else 0 END) AS 'xx=40'
  FROM temp_0
  group by Name
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56591447

复制
相关文章

相似问题

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