首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

不带聚合函数的SQL Server数据透视查询

在 SQL Server 中,数据透视查询通常使用 PIVOT 操作符来实现。然而,PIVOT 操作符通常需要聚合函数来汇总数据。如果你想在不使用聚合函数的情况下进行数据透视,可以使用条件聚合(conditional aggregation)来实现。

假设你有一个表 Sales,其结构如下:

代码语言:javascript
复制
CREATE TABLE Sales (
    SalesPerson NVARCHAR(50),
    Product NVARCHAR(50),
    Amount INT
);

INSERT INTO Sales (SalesPerson, Product, Amount) VALUES
('Alice', 'ProductA', 100),
('Alice', 'ProductB', 150),
('Bob', 'ProductA', 200),
('Bob', 'ProductC', 250);

你希望将数据透视,使每个销售人员的销售额按产品列出,而不使用聚合函数。可以使用条件聚合来实现这一点:

代码语言:javascript
复制
SELECT
    SalesPerson,
    MAX(CASE WHEN Product = 'ProductA' THEN Amount ELSE NULL END) AS ProductA,
    MAX(CASE WHEN Product = 'ProductB' THEN Amount ELSE NULL END) AS ProductB,
    MAX(CASE WHEN Product = 'ProductC' THEN Amount ELSE NULL END) AS ProductC
FROM Sales
GROUP BY SalesPerson;

解释

  1. 条件聚合
    • 使用 CASE 表达式来检查每一行的 Product 列。
    • 如果 Product 列的值匹配特定产品(如 'ProductA'),则返回 Amount 列的值,否则返回 NULL
  2. MAX 函数
    • 由于每个销售人员和产品组合只有一个值,MAX 函数在这里不会实际进行聚合,而是简单地返回该值。
  3. GROUP BY
    • SalesPerson 分组,以确保每个销售人员只有一行。

结果

上述查询将返回以下结果:

SalesPerson

ProductA

ProductB

ProductC

Alice

100

150

NULL

Bob

200

NULL

250

动态列名

如果产品列是动态的(即你不知道有多少种产品),你可以使用动态 SQL 来生成查询。以下是一个示例:

代码语言:javascript
复制
DECLARE @cols AS NVARCHAR(MAX),
        @query AS NVARCHAR(MAX);

-- 获取所有产品的列名
SELECT @cols = STRING_AGG(QUOTENAME(Product), ',')
FROM (SELECT DISTINCT Product FROM Sales) AS Products;

-- 构建动态 SQL 查询
SET @query = '
SELECT SalesPerson, ' + @cols + '
FROM (
    SELECT SalesPerson, Product, Amount
    FROM Sales
) AS SourceTable
PIVOT (
    MAX(Amount)
    FOR Product IN (' + @cols + ')
) AS PivotTable
ORDER BY SalesPerson';

-- 执行动态 SQL 查询
EXEC sp_executesql @query;

解释

  1. 获取列名
    • 使用 STRING_AGG 函数获取所有产品的列名,并用逗号分隔。
  2. 构建动态 SQL 查询
    • 使用 PIVOT 操作符和 MAX 函数来生成透视表。
  3. 执行动态 SQL 查询
    • 使用 sp_executesql 存储过程执行动态 SQL 查询。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

12分34秒

Java教程 2 数据查询SQL操作 15 聚合函数 学习猿地

20分0秒

098_尚硅谷大数据技术_Flink理论_Table API和Flink SQL(十九)_聚合函数

7分31秒

099_尚硅谷大数据技术_Flink理论_Table API和Flink SQL(二十)_表聚合函数

17分14秒

Java教程 2 数据查询SQL操作 14 转换函数 学习猿地

16分30秒

Java教程 2 数据查询SQL操作 13 字符串+数字函数 学习猿地

16分30秒

Java教程 2 数据查询SQL操作 13 字符串 数字函数 学习猿地

3分28秒

Java教程 2 数据查询SQL操作 11 条件的优先级 学习猿地

15分55秒

084_尚硅谷大数据技术_Flink理论_Table API和Flink SQL(五)_表的查询

21分5秒

142_第十一章_Table API和SQL(六)_聚合查询(一)_分组聚合

16分1秒

143_第十一章_Table API和SQL(六)_聚合查询(二)_窗口聚合

15分22秒

144_第十一章_Table API和SQL(六)_聚合查询(三)_开窗聚合

23分6秒

020_尚硅谷_Table API和Flink SQL_自定义聚合函数

领券