SQL SERVER 列转行
时间: 2024-07-17 15:00:48 浏览: 145
在SQL Server中,将列转换为行(也称为行化或膨胀)通常涉及到使用一些扩展函数或者自连接来重塑数据结构。这种操作通常在需要对数据进行更复杂操作时,如分组、聚合或者连接操作之前进行,以便于处理。
例如,假设你有一个表`Sales`,其中有一个`ProductCategories`列,它包含多个逗号分隔的产品类别,你可能想要将这些类别拆分成单独的行:
```sql
DECLARE @OriginalTable TABLE (ID INT, ProductCategories VARCHAR(100))
INSERT INTO @OriginalTable VALUES (1, 'Electronics,Books,Furniture')
-- 使用STRING_SPLIT扩展函数
WITH CTE_Split AS (
SELECT ID, value
FROM @OriginalTable
CROSS APPLY STRING_SPLIT(ProductCategories, ',')
)
SELECT ID, Category
FROM CTE_Split
```
在这个例子中,`STRING_SPLIT`函数将`ProductCategories`列拆分为一行一行的`value`,然后你可以根据需要进一步处理每个类别。
相关问题
sql server列转行
在 SQL Server 中,可以使用 `UNPIVOT` 关键字将列转换为行。
假设有以下表:
```
CREATE TABLE [dbo].[Sales](
[Product] [nvarchar](50) NULL,
[Year1] [int] NULL,
[Year2] [int] NULL,
[Year3] [int] NULL
)
INSERT INTO [dbo].[Sales] ([Product], [Year1], [Year2], [Year3])
VALUES
('Product1', 100, 200, 300),
('Product2', 400, 500, 600),
('Product3', 700, 800, 900)
```
要将 Year1、Year2 和 Year3 列转换为行,可以使用以下查询:
```
SELECT [Product], [Year], [Amount]
FROM
(SELECT [Product], [Year1], [Year2], [Year3]
FROM [dbo].[Sales]) p
UNPIVOT
([Amount] FOR [Year] IN
([Year1], [Year2], [Year3])
)AS unpvt;
```
查询结果如下:
```
Product Year Amount
--------------------------
Product1 Year1 100
Product1 Year2 200
Product1 Year3 300
Product2 Year1 400
Product2 Year2 500
Product2 Year3 600
Product3 Year1 700
Product3 Year2 800
Product3 Year3 900
```
在上面的查询中,我们首先选择了所有的列,然后使用 `UNPIVOT` 将 Year1、Year2 和 Year3 列转换为行。在 `UNPIVOT` 子句中,我们指定了要转换的列和转换后的列名。最后,我们使用 `AS` 关键字为子查询结果集定义别名 `unpvt`。
sql server 列转行
您好,我理解您的问题是如何将 SQL Server 中的列转换为行。您可以使用 UNPIVOT 或 CROSS APPLY 操作来实现此目的。
使用 UNPIVOT:
SELECT [Category], [Value]
FROM
(SELECT [Name], [CategoryA], [CategoryB], [CategoryC]
FROM [YourTable]) p
UNPIVOT
([Value] FOR [Category] IN
([CategoryA], [CategoryB], [CategoryC])
) AS unpvt;
使用 CROSS APPLY:
SELECT [Name], [Category], [Value]
FROM [YourTable]
CROSS APPLY (VALUES ('CategoryA', [CategoryA]),
('CategoryB', [CategoryB]),
('CategoryC', [CategoryC])
) AS unpvt ([Category], [Value]);
希望这能解决您的问题。请随时在需要时向我提问。
阅读全文