Heim Datenbank MySQL-Tutorial SQL Server 动态行转列

SQL Server 动态行转列

Jun 07, 2016 pm 04:22 PM
server 动态

一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段; 方法二:使用拼接SQL,动态列字段; 方法三:使用PIVOT关系运算符,静态列字段; 方法四:使用PIVOT关系运算符,动态列字段;

   一.本文所涉及的内容(Contents)

  本文所涉及的内容(Contents)

  背景(Contexts)

  实现代码(SQL Codes)

  方法一:使用拼接SQL,静态列字段;

  方法二:使用拼接SQL,动态列字段;

  方法三:使用PIVOT关系运算符,静态列字段;

  方法四:使用PIVOT关系运算符,,动态列字段;

  二.背景(Contexts)

  其实行转列并不是一个什么新鲜的话题了,甚至已经被大家说到烂了,网上的很多例子多多少少都有些问题,所以我希望能让大家快速的看到执行的效果,所以在动态列的基础上再把表、分组字段、行转列字段、值这四个行转列固定需要的值变成真正意义的参数化,大家只需要根据自己的环境,设置参数值,马上就能看到效果了(可以直接跳转至:“参数化动态PIVOT行转列”查看具体的脚本代码)。行转列的效果图如图1所示:

SQL Server 动态行转列 三联

  (图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]

wps_clip_image-8842

  (图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

wps_clip_image-14456

  (图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)

wps_clip_image-17757

  (图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)

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Fix: Die dynamische Aktualisierungsrate von Windows 11 funktioniert nicht Fix: Die dynamische Aktualisierungsrate von Windows 11 funktioniert nicht Apr 13, 2023 pm 08:52 PM

Sie können die Aktualisierungsrate eines Bildschirms messen, indem Sie zählen, wie oft das Bild pro Sekunde aktualisiert wird. DRR ist eine neue Funktion in Windows 11, die Ihnen hilft, Akkulaufzeit zu sparen und gleichzeitig für eine flüssigere Anzeige zu sorgen. Es ist jedoch keine Überraschung, wenn sie nicht richtig funktioniert. Es wird erwartet, dass Bildschirme mit höheren Bildwiederholraten häufiger vorkommen, da immer mehr Hersteller Pläne ankündigen, die Produktion von 60-Hz-Monitoren einzustellen. Dies führt zu einem flüssigeren Scrollen und besseren Spielen, geht jedoch mit einer kürzeren Akkulaufzeit einher. Allerdings ist die Funktion der dynamischen Bildwiederholfrequenz in dieser Version des Betriebssystems eine praktische Ergänzung, die einen großen Einfluss auf Ihr Gesamterlebnis haben kann. Lesen Sie weiter, während wir besprechen, was zu tun ist, wenn die dynamische Aktualisierungsrate von Windows 11 nicht funktioniert

So blenden Sie Dynamic Island und Red Indicator bei der iPhone-Bildschirmaufzeichnung aus So blenden Sie Dynamic Island und Red Indicator bei der iPhone-Bildschirmaufzeichnung aus Apr 13, 2023 am 09:13 AM

Auf dem iPhone zeichnet die Bildschirmaufzeichnungsfunktion von Apple ein Video von dem auf, was Sie auf dem Bildschirm tun. Dies ist nützlich, wenn Sie das Gameplay aufzeichnen, jemanden durch ein Tutorial in einer App führen, einen Fehler demonstrieren oder etwas anderes tun möchten. Bei älteren iPhones, die über eine Kerbe am oberen Displayrand verfügen, ist die Kerbe bei der Bildschirmaufnahme nicht sichtbar, wie es sein sollte. Aber auf neueren iPhones mit der „Dynamic Island“-Aussparung, wie dem „iPhone 14 Pro“ und dem „iPhone 14 Pro“ Max, zeigt die „Dynamic Island“-Animation die rote Aufnahmeanzeige an, wodurch die Aussparung in aufgenommenen Videos sichtbar ist. das könnte sein

Konvertieren Sie die Festplatte von VirtualBox in eine dynamische Festplatte und umgekehrt Konvertieren Sie die Festplatte von VirtualBox in eine dynamische Festplatte und umgekehrt Mar 25, 2024 am 09:36 AM

Beim Erstellen einer virtuellen Maschine werden Sie aufgefordert, einen Festplattentyp auszuwählen. Sie können zwischen einer festen Festplatte und einer dynamischen Festplatte wählen. Was ist, wenn Sie sich für Festplatten entscheiden und später feststellen, dass Sie dynamische Festplatten benötigen, oder umgekehrt? Sie können die eine in die andere konvertieren. In diesem Beitrag erfahren Sie, wie Sie eine VirtualBox-Festplatte in eine dynamische Festplatte umwandeln und umgekehrt. Eine dynamische Festplatte ist eine virtuelle Festplatte, die zunächst klein ist und mit der Speicherung von Daten in der virtuellen Maschine immer größer wird. Dynamische Festplatten sparen sehr effizient Speicherplatz, da sie nur so viel Host-Speicherplatz beanspruchen, wie benötigt wird. Wenn jedoch die Festplattenkapazität zunimmt, kann die Leistung Ihres Computers geringfügig beeinträchtigt werden. In virtuellen Maschinen werden häufig Festplatten und dynamische Festplatten verwendet

So konvertieren Sie einen dynamischen Datenträger in einen Basisdatenträger unter Windows 11 So konvertieren Sie einen dynamischen Datenträger in einen Basisdatenträger unter Windows 11 Sep 23, 2023 pm 11:33 PM

Wenn Sie in Windows 11 einen dynamischen Datenträger in einen Basisdatenträger umwandeln möchten, sollten Sie zunächst ein Backup erstellen, da bei diesem Vorgang alle darin enthaltenen Daten gelöscht werden. Warum sollten Sie in Windows 11 einen dynamischen Datenträger in einen Basisdatenträger konvertieren? Laut Microsoft sind dynamische Datenträger von Windows veraltet und ihre Verwendung wird nicht mehr empfohlen. Darüber hinaus unterstützt Windows Home Edition keine dynamischen Datenträger, sodass Sie nicht auf diese logischen Laufwerke zugreifen können. Wenn Sie mehrere Festplatten zu einem größeren Volume zusammenfassen möchten, empfiehlt sich die Verwendung von Basisfestplatten oder Speicherplätzen. In diesem Artikel zeigen wir Ihnen, wie Sie einen dynamischen Datenträger unter Windows 11 in einen Basisdatenträger konvertieren. Wie konvertiert man einen dynamischen Datenträger unter Windows 11 in einen Basisdatenträger? am Anfang

Anleitung zum Installieren, Deinstallieren und Zurücksetzen des Windows-Server-Backups Anleitung zum Installieren, Deinstallieren und Zurücksetzen des Windows-Server-Backups Mar 06, 2024 am 10:37 AM

WindowsServerBackup ist eine Funktion des WindowsServer-Betriebssystems, die Benutzern dabei helfen soll, wichtige Daten und Systemkonfigurationen zu schützen und vollständige Sicherungs- und Wiederherstellungslösungen für kleine, mittlere und große Unternehmen bereitzustellen. Nur Benutzer, die Server2022 und höher ausführen, können diese Funktion nutzen. In diesem Artikel erklären wir, wie Sie WindowsServerBackup installieren, deinstallieren oder zurücksetzen. So setzen Sie die Windows Server-Sicherung zurück: Wenn Sie Probleme mit der Sicherung Ihres Servers haben, die Sicherung zu lange dauert oder Sie nicht auf gespeicherte Dateien zugreifen können, können Sie die Sicherungseinstellungen Ihres Windows Servers zurücksetzen. Um Windows zurückzusetzen

Wie deaktiviere ich die dynamische Anzeige von Ordnern und Dateien, um den schnellen Zugriff in Windows 10 und 11 zu verhindern? Wie deaktiviere ich die dynamische Anzeige von Ordnern und Dateien, um den schnellen Zugriff in Windows 10 und 11 zu verhindern? May 06, 2023 pm 04:58 PM

Microsoft hat den Schnellzugriff in Windows 10 eingeführt und die Funktion im kürzlich veröffentlichten Betriebssystem Windows 11 beibehalten. Der Schnellzugriff ersetzt das Favoritensystem im Datei-Explorer. Einer der Hauptunterschiede zwischen den beiden Funktionen besteht darin, dass Quick Access seiner Liste eine dynamische Komponente hinzufügt. Einige Ordner werden dauerhaft angezeigt, während andere je nach Nutzung angezeigt werden. Feste Ordner werden mit einem Stecknadelsymbol angezeigt, während dynamische Ordner kein solches Symbol haben. Für weitere Einzelheiten können Sie sich hier einen Vergleich zwischen „Meine Favoriten“ und „Schnellzugriff“ ansehen. Der Schnellzugriff ist leistungsfähiger als Favoriten, aber dynamische Ordnerlisten sorgen für etwas Unordnung. Möglicherweise werden Dateien angezeigt, die nutzlos sind oder nicht im Datei-Explorer hervorgehoben werden sollten

So erhalten Sie Live-Kacheln auf dem Desktop und im Startmenü in Windows 11 So erhalten Sie Live-Kacheln auf dem Desktop und im Startmenü in Windows 11 Apr 14, 2023 pm 05:07 PM

Stellen Sie sich vor, Sie suchen etwas auf Ihrem System, sind sich aber nicht sicher, welche Anwendung Sie öffnen oder auswählen sollen. Hier kommt die Live Tiles-Funktion ins Spiel. Eine Live-Kachel für jede unterstützte Anwendung kann zum Desktop oder zum Startmenü des Windows-Systems hinzugefügt werden, wobei sich die Kacheln häufig ändern. LiveTiles erwecken Anwendungs-Widgets auf sehr angenehme Weise zum Leben. Nicht nur wegen seines Aussehens, sondern auch wegen seiner Bequemlichkeit. Angenommen, Sie verwenden eine WhatsApp- oder Facebook-Anwendung auf Ihrem System. Wäre es dann nicht praktisch, wenn die Anzahl der Benachrichtigungen auf dem Anwendungssymbol angezeigt würde? Dies ist möglich, wenn eine der unterstützten Apps als Live-Kachel hinzugefügt wird. Mal sehen, wie es unter Windows geht

So verwenden Sie Dynamic Lock unter Windows 11 So verwenden Sie Dynamic Lock unter Windows 11 Apr 13, 2023 pm 08:31 PM

Was ist dynamisches Sperren unter Windows 11? Dynamic Lock ist eine Funktion von Windows 11, die Ihren Computer sperrt, wenn ein verbundenes Bluetooth-Gerät (Ihr Telefon oder Wearable) außer Reichweite ist. Die Funktion „Dynamische Sperre“ sperrt Ihren PC automatisch, auch wenn Sie beim Weggehen vergessen, die Windows-Taste + L-Tastenkombination zu verwenden. Dynamic Lock funktioniert mit jedem über Bluetooth verbundenen Gerät. Am besten verwenden Sie jedoch ein Gerät mit ausreichend Akkuleistung und Reichweite, z. B. Ihrem Telefon. Sobald Ihr Gerät 30 Sekunden lang nicht mehr erreichbar ist, sperrt Windows automatisch den Bildschirm. Koppeln Sie ein Bluetooth-Gerät mit Windows 11. Damit alles ordnungsgemäß funktioniert, müssen Sie dies zunächst tun

See all articles