SQL Server 动态行转列
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段; 方法二:使用拼接SQL,动态列字段; 方法三:使用PIVOT关系运算符,静态列字段; 方法四:使用PIVOT关系运算符,动态列字段;
一.本文所涉及的内容(Contents)
本文所涉及的内容(Contents)
背景(Contexts)
实现代码(SQL Codes)
方法一:使用拼接SQL,静态列字段;
方法二:使用拼接SQL,动态列字段;
方法三:使用PIVOT关系运算符,静态列字段;
方法四:使用PIVOT关系运算符,,动态列字段;
二.背景(Contexts)
其实行转列并不是一个什么新鲜的话题了,甚至已经被大家说到烂了,网上的很多例子多多少少都有些问题,所以我希望能让大家快速的看到执行的效果,所以在动态列的基础上再把表、分组字段、行转列字段、值这四个行转列固定需要的值变成真正意义的参数化,大家只需要根据自己的环境,设置参数值,马上就能看到效果了(可以直接跳转至:“参数化动态PIVOT行转列”查看具体的脚本代码)。行转列的效果图如图1所示:
(图1:行转列效果图)
三.实现代码(SQL Codes)
(一) 首先我们先创建一个测试表,往里面插入测试数据,返回表记录如图2所示:
--创建测试表
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TestRows2Columns]') AND type in (N'U'))
DROP TABLE [dbo].[TestRows2Columns]
GO
CREATE TABLE [dbo].[TestRows2Columns](
[Id] [int] IDENTITY(1,1) NOT NULL,
[UserName] [nvarchar](50) NULL,
[Subject] [nvarchar](50) NULL,
[Source] [numeric](18, 0) NULL
) ON [PRIMARY]
GO
--插入测试数据
INSERT INTO [TestRows2Columns] ([UserName],[Subject],[Source])
SELECT N'张三',N'语文',60 UNION ALL
SELECT N'李四',N'数学',70 UNION ALL
SELECT N'王五',N'英语',80 UNION ALL
SELECT N'王五',N'数学',75 UNION ALL
SELECT N'王五',N'语文',57 UNION ALL
SELECT N'李四',N'语文',80 UNION ALL
SELECT N'张三',N'英语',100
GO
SELECT * FROM [TestRows2Columns]
(图2:样本数据)
(二) 先以静态的方式实现行转列,效果如图3所示:
--1:静态拼接行转列
SELECT [UserName],
SUM(CASE [Subject] WHEN '数学' THEN [Source] ELSE 0 END) AS '[数学]',
SUM(CASE [Subject] WHEN '英语' THEN [Source] ELSE 0 END) AS '[英语]',
SUM(CASE [Subject] WHEN '语文' THEN [Source] ELSE 0 END) AS '[语文]'
FROM [TestRows2Columns]
GROUP BY [UserName]
GO
(图3:样本数据)
(三) 接着以动态的方式实现行转列,这是使用拼接SQL的方式实现的,所以它适用于SQL Server 2000以上的数据库版本,执行脚本返回的结果如图2所示;
--2:动态拼接行转列
DECLARE @sql VARCHAR(8000)
SET @sql = 'SELECT [UserName],'
SELECT @sql = @sql + 'SUM(CASE [Subject] WHEN '''+[Subject]+''' THEN [Source] ELSE 0 END) AS '''+QUOTENAME([Subject])+''','
FROM (SELECT DISTINCT [Subject] FROM [TestRows2Columns]) AS a
SELECT @sql = LEFT(@sql,LEN(@sql)-1) + ' FROM [TestRows2Columns] GROUP BY [UserName]'
PRINT(@sql)
EXEC(@sql)
GO
(四) 在SQL Server 2005之后有了一个专门的PIVOT 和 UNPIVOT 关系运算符做行列之间的转换,下面是静态的方式实现的,实现效果如图4所示:
--3:静态PIVOT行转列
SELECT *
FROM ( SELECT [UserName] ,
[Subject] ,
[Source]
FROM [TestRows2Columns]
) p PIVOT
( SUM([Source]) FOR [Subject] IN ( [数学],[英语],[语文] ) ) AS pvt
ORDER BY pvt.[UserName];
GO
(图4)
(五) 把上面静态的SQL基础上进行修改,这样就不用理会记录里面存储了什么,需要转成什么列名的问题了,脚本如下,效果如图4所示:
--4:动态PIVOT行转列
DECLARE @sql_str VARCHAR(8000)
DECLARE @sql_col VARCHAR(8000)
SELECT @sql_col = ISNULL(@sql_col + ',','') + QUOTENAME([Subject]) FROM [TestRows2Columns] GROUP BY [Subject]
SET @sql_str = '
SELECT * FROM (
SELECT [UserName],[Subject],[Source] FROM [TestRows2Columns]) p PIVOT
(SUM([Source]) FOR [Subject] IN ( '+ @sql_col +') ) AS pvt
ORDER BY pvt.[UserName]'
PRINT (@sql_str)
EXEC (@sql_str)
(六) 也许很多人到了上面一步就够了,但是你会发现,当别人拿到你的代码,需要不断的修改成他自己环境中表名、分组列、行转列字段、字段值这几个参数,逻辑如图5所示,所以,我继续对上面的脚本进行修改,你只要设置自己的参数就可以实现行转列了,效果如图4所示:
--5:参数化动态PIVOT行转列
-- =============================================
-- Author:
-- Create date:
-- Description:
-- Blog:
-- =============================================
DECLARE @sql_str NVARCHAR(MAX)
DECLARE @sql_col NVARCHAR(MAX)
DECLARE @tableName SYSNAME --行转列表
DECLARE @groupColumn SYSNAME --分组字段
DECLARE @row2column SYSNAME --行变列的字段
DECLARE @row2columnValue SYSNAME --行变列值的字段
SET @tableName = 'TestRows2Columns'
SET @groupColumn = 'UserName'
SET @row2column = 'Subject'
SET @row2columnValue = 'Source'
--从行数据中获取可能存在的列
SET @sql_str = N'
SELECT @sql_col_out = ISNULL(@sql_col_out + '','','''') + QUOTENAME(['+@row2column+'])
FROM ['+@tableName+'] GROUP BY ['+@row2column+']'
--PRINT @sql_str
EXEC sp_executesql @sql_str,N'@sql_col_out NVARCHAR(MAX) OUTPUT',@sql_col_out=@sql_col OUTPUT
--PRINT @sql_col
SET @sql_str = N'
SELECT * FROM (
SELECT ['+@groupColumn+'],['+@row2column+'],['+@row2columnValue+'] FROM ['+@tableName+']) p PIVOT
(SUM(['+@row2columnValue+']) FOR ['+@row2column+'] IN ( '+ @sql_col +') ) AS pvt
ORDER BY pvt.['+@groupColumn+']'
--PRINT (@sql_str)
EXEC (@sql_str)
(图5)
(七) 在实际的运用中,我经常遇到需要对基础表的数据进行筛选后再进行行转列,那么下面的脚本将满足你这个需求,效果如图6所示:
--6:带条件查询的参数化动态PIVOT行转列
-- =============================================
-- Author:
-- Create date:
-- Description:
-- Blog:
-- =============================================
DECLARE @sql_str NVARCHAR(MAX)
DECLARE @sql_col NVARCHAR(MAX)
DECLARE @sql_where NVARCHAR(MAX)
DECLARE @tableName SYSNAME --行转列表
DECLARE @groupColumn SYSNAME --分组字段
DECLARE @row2column SYSNAME --行变列的字段
DECLARE @row2columnValue SYSNAME --行变列值的字段
SET @tableName = 'TestRows2Columns'
SET @groupColumn = 'UserName'
SET @row2column = 'Subject'
SET @row2columnValue = 'Source'
SET @sql_where = 'WHERE UserName = ''王五'''
--从行数据中获取可能存在的列
SET @sql_str = N'
SELECT @sql_col_out = ISNULL(@sql_col_out + '','','''') + QUOTENAME(['+@row2column+'])
FROM ['+@tableName+'] '+@sql_where+' GROUP BY ['+@row2column+']'
--PRINT @sql_str
EXEC sp_executesql @sql_str,N'@sql_col_out NVARCHAR(MAX) OUTPUT',@sql_col_out=@sql_col OUTPUT
--PRINT @sql_col
SET @sql_str = N'
SELECT * FROM (
SELECT ['+@groupColumn+'],['+@row2column+'],['+@row2columnValue+'] FROM ['+@tableName+']'+@sql_where+') p PIVOT
(SUM(['+@row2columnValue+']) FOR ['+@row2column+'] IN ( '+ @sql_col +') ) AS pvt
ORDER BY pvt.['+@groupColumn+']'
--PRINT (@sql_str)
EXEC (@sql_str)
(图6)

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Anda boleh mengukur kadar segar semula skrin dengan mengira bilangan kali imej dikemas kini sesaat. DRR ialah ciri baharu yang disertakan dalam Windows 11 yang membantu anda menjimatkan hayat bateri sambil tetap memberikan paparan yang lebih lancar, tetapi tidak mengejutkan apabila ia tidak berfungsi dengan betul. Skrin dengan kadar penyegaran yang lebih tinggi dijangka menjadi lebih biasa apabila lebih banyak pengeluar mengumumkan rancangan untuk berhenti menghasilkan monitor 60Hz. Ini akan menghasilkan penatalan yang lebih lancar dan permainan yang lebih baik, tetapi ia akan mendatangkan kos hayat bateri yang dikurangkan. Walau bagaimanapun, ciri kadar penyegaran dinamik dalam lelaran OS ini adalah tambahan bagus yang boleh memberi kesan besar pada keseluruhan pengalaman anda. Teruskan membaca semasa kami membincangkan perkara yang perlu dilakukan jika kadar penyegaran dinamik Windows 11 tidak berfungsi

Pada iPhone, ciri rakaman skrin Apple merekodkan video tentang perkara yang anda lakukan pada skrin, yang berguna jika anda ingin menangkap permainan, memandu seseorang melalui tutorial dalam apl, menunjukkan pepijat atau apa-apa lagi. Pada iPhone lama yang mempunyai takuk di bahagian atas paparan, takuk tidak kelihatan dalam rakaman skrin, seperti yang sepatutnya. Tetapi pada iPhone yang lebih baharu dengan potongan Dynamic Island, seperti iPhone 14 Pro dan iPhone 14 Pro Max, animasi Dynamic Island memaparkan penunjuk rakaman merah, yang menyebabkan potongan itu kelihatan dalam video yang dirakam. ini mungkin

Apabila mencipta mesin maya, anda akan diminta untuk memilih jenis cakera, anda boleh memilih cakera tetap atau cakera dinamik. Bagaimana jika anda memilih cakera tetap dan kemudian menyedari bahawa anda memerlukan cakera dinamik, atau sebaliknya. Anda boleh menukar satu kepada yang lain? Dalam siaran ini, kita akan melihat cara menukar cakera tetap VirtualBox kepada cakera dinamik dan sebaliknya. Cakera dinamik ialah cakera keras maya yang pada mulanya mempunyai saiz kecil dan membesar dalam saiz semasa anda menyimpan data dalam mesin maya. Cakera dinamik sangat cekap dalam menjimatkan ruang storan kerana ia hanya mengambil sebanyak mungkin ruang storan hos seperti yang diperlukan. Walau bagaimanapun, apabila kapasiti cakera berkembang, prestasi komputer anda mungkin terjejas sedikit. Cakera tetap dan cakera dinamik biasanya digunakan dalam mesin maya

Jika anda ingin menukar cakera dinamik kepada cakera asas dalam Windows 11, anda harus membuat sandaran terlebih dahulu kerana proses itu akan memadamkan semua data di dalamnya. Mengapa anda perlu menukar cakera dinamik kepada cakera asas dalam Windows 11? Menurut Microsoft, cakera dinamik telah ditamatkan dari Windows dan penggunaannya tidak lagi disyorkan. Selain itu, Windows Home Edition tidak menyokong cakera dinamik, jadi anda tidak akan dapat mengakses pemacu logik ini. Jika anda ingin menggabungkan lebih banyak cakera kepada volum yang lebih besar, kami mengesyorkan anda menggunakan Cakera Asas atau Ruang Storan. Dalam artikel ini, kami akan menunjukkan kepada anda cara menukar cakera dinamik kepada cakera asas pada Windows 11 Bagaimana untuk menukar cakera dinamik kepada cakera asas dalam Windows 11? pada permulaannya

Bayangkan anda sedang mencari sesuatu pada sistem anda tetapi tidak pasti aplikasi mana yang hendak dibuka atau dipilih. Di sinilah ciri Jubin Langsung dimainkan. Jubin langsung untuk mana-mana aplikasi yang disokong boleh ditambahkan pada desktop atau menu Mula sistem Windows anda, dengan jubinnya sering berubah. LiveTiles menjadikan widget aplikasi menjadi hidup dengan cara yang sangat menggembirakan. Bukan sahaja untuk penampilannya, malah untuk kemudahan. Katakan anda menggunakan aplikasi whatsapp atau facebook pada sistem anda, bukankah lebih senang jika bilangan pemberitahuan dipaparkan pada ikon aplikasi? Ini boleh dilakukan jika mana-mana apl yang disokong sedemikian ditambahkan sebagai jubin langsung. Mari lihat cara melakukannya dalam Windows

WindowsServerBackup ialah fungsi yang disertakan dengan sistem pengendalian WindowsServer, direka untuk membantu pengguna melindungi data penting dan konfigurasi sistem, serta menyediakan penyelesaian sandaran dan pemulihan yang lengkap untuk perusahaan peringkat kecil, sederhana dan perusahaan. Hanya pengguna yang menjalankan Server2022 dan lebih tinggi boleh menggunakan ciri ini. Dalam artikel ini, kami akan menerangkan cara memasang, menyahpasang atau menetapkan semula WindowsServerBackup. Cara Menetapkan Semula Sandaran Pelayan Windows Jika anda mengalami masalah dengan sandaran pelayan anda, sandaran mengambil masa terlalu lama, atau anda tidak dapat mengakses fail yang disimpan, maka anda boleh mempertimbangkan untuk menetapkan semula tetapan sandaran Pelayan Windows anda. Untuk menetapkan semula Windows

Microsoft memperkenalkan Akses Pantas dalam Windows 10 dan mengekalkan ciri tersebut dalam sistem pengendalian Windows 11 yang dikeluarkan baru-baru ini. Akses Pantas menggantikan sistem Kegemaran dalam Penjelajah Fail. Salah satu perbezaan teras antara kedua-dua ciri ialah Akses Pantas menambah komponen dinamik pada senarainya. Sesetengah folder muncul secara kekal, manakala yang lain muncul berdasarkan penggunaan. Folder tetap dipaparkan dengan ikon pin, manakala folder dinamik tidak mempunyai ikon sedemikian. Anda boleh melihat perbandingan antara Kegemaran Saya dan Akses Pantas di sini untuk mendapatkan butiran lanjut. Akses Pantas lebih berkuasa daripada Kegemaran, tetapi senarai folder dinamik menambah unsur kekacauan padanya. Fail yang tidak berguna atau tidak sepatutnya diserlahkan dalam File Explorer mungkin dipaparkan

Apakah penguncian dinamik pada Windows 11? Dynamic Lock ialah ciri Windows 11 yang mengunci komputer anda apabila peranti Bluetooth yang disambungkan (telefon anda atau boleh pakai) keluar dari julat. Ciri Dynamic Lock mengunci PC anda secara automatik walaupun anda terlupa menggunakan pintasan Windows Key + L semasa berjalan pergi. Dynamic Lock berfungsi dengan mana-mana peranti yang disambungkan dengan Bluetooth, tetapi sebaiknya gunakan peranti yang mempunyai kuasa dan julat bateri yang mencukupi, seperti telefon anda. Setelah peranti anda menjadi tidak boleh diakses selama 30 saat, Windows akan mengunci skrin secara automatik. Gandingkan peranti Bluetooth dengan Windows 11 Untuk semuanya berfungsi dengan baik, anda perlu terlebih dahulu
