sql - 多行成一行多列
问题描述
我们需要将所有数字列为平面数据集,我们该怎么做?
表名称:电话
ID TYPE NUMBER
==================================
123 MN 042153939
123 HN 2242116
123 MN 1234567890
123 HN 12345678
Create Table Telephone
(
ID Integer,
Type char(3),
Number Varchar(20)
);
insert into Telephone values
(123, 'MN', '042153939'),
(123, 'HN', '2242116'),
(123, 'MN', '1234567890'),
(123, 'HN', '12345678');
我希望 SQL 以这种格式返回数据
ID MN#1 Mn#2 HN#1 HN#2
================================================
123 042153939 1234567890 2242116 12345678
解决方案
动态方法
在里面
DROP TABLE IF EXISTS #Telephone;
CREATE TABLE #Telephone(ID INT,Type CHAR(3),Number VARCHAR(20));
INSERT INTO #Telephone (ID,Type,Number) VALUES
(123, 'MN', '042153939'),
(123, 'HN', '2242116'),
(123, 'MN', '1234567890'),
(123, 'HN', '12345678');
编码
DECLARE @ColumnList NVARCHAR(MAX);
SELECT @ColumnList = STUFF((SELECT ',[' + RTRIM(t.[Type]) + '#'
+ CONVERT(NVARCHAR(255),ROW_NUMBER()OVER(PARTITION BY t.[Type] ORDER BY t.ID)) + ']'
FROM #Telephone t FOR XML PATH(''),TYPE).value('(./text())[1]','NVARCHAR(MAX)'),1,1,'')
;
DECLARE @sql NVARCHAR(MAX) = '';
SET @sql = N'
SELECT ID,' + @ColumnList + N'
FROM (
SELECT t.ID,t.Number, RTRIM(t.[Type]) + ''#'' + CONVERT(NVARCHAR(255),ROW_NUMBER()OVER(PARTITION BY t.[Type] ORDER BY t.ID)) AS [Type]
FROM #Telephone t
) a
PIVOT(MAX(a.Number) FOR a.Type IN (' + @ColumnList + N')) p
'
;
--PRINT @sql
IF @sql IS NOT NULL EXEC(@sql);
推荐阅读
- python - 如何在 Visual Studio Code 中查找/执行 Python 交互模式?
- react-native - onEndReached 在渲染时被多次调用
- slack-api - 从 Slack API 中的“reaction_added”事件中获取“thread_ts”
- plotly - 在散点图中使用自定义字体图标
- paypal - 将 Paypal 支付按钮嵌入社区网站
- c++ - 如何在 SDL 中刷新屏幕(SDL_RenderClear 不起作用)?
- mysql - 为什么 MySQL 容器在使用 WSL 2 的 Windows 10 Home 上不断重启?
- arrays - 如何将数组的最后一个元素与 MPI C 中另一个进程的数组的第一个元素进行比较?
- bash - 是否可以将 HERE 文档和重定向结合起来写入文件而不在 Bash 中生成过程?
- clojure - 如何将字符串的clojure惰性序列转换为单独的字符串?