sql - 分组/数据透视表
问题描述
我正在尝试在不使用聚合函数的情况下旋转表
我尝试了 2 个 pivot 的一个来获取最大和最小名称,但它不起作用
Declare @test table()
Name varchar(30) not null,
Grade varchar(10) not null,
Subject varchar(10) not null
)
insert into @test values('Ami', 'HD', 'Java')
insert into @test values('Ami', 'D', 'C++')
insert into @test values('Bec', 'D', 'Java')
insert into @test values('Bec', 'P', 'C++')
insert into @test values('Bec', 'Pa', 'C++')
select * from @test
select Name, Max(case Subject when 'C++' then Grade end) 'C++',
Max(case Subject when 'Java' then Grade end) 'Java'
from @test
group by Name
SELECT * FROM
(
select Name, grade, subject from @test
)x
PIVOT
(
MIN(grade)
for subject IN ([JAVA],[C++])
)p
解决方案
您可以使用 CTE 添加一个ROW_NUMBER
值,然后将其添加到您的GROUP BY
. 我还将逻辑更改为交叉表,因为它们比内置PIVOT
运算符更灵活:
WITH CTE AS(
SELECT [Name],
Grade,
Subject,
ROW_NUMBER() OVER (PARTITION BY [Name], Subject ORDER BY Grade) AS RN
FROM @test t)
SELECT [Name],
MAX(CASE Subject WHEN 'C++' THEN Grade END) AS [C++],
MAX(CASE Subject WHEN 'Java' THEN Grade END) AS [Java]
FROM CTE
GROUP BY [Name],
RN;
推荐阅读
- audiokit - AKFrequencyTracker 没有得到正确的频率
- c - 有分段错误
- javascript - 将对象之间的值乘以索引
- javascript - 如何修复石头剪刀布蜥蜴 spock 程序的输出表?
- java - 如何在 Java 中自动创建自述文件,而不是从 Git 中心
- python - 在 python 上从 LabVIEW 读取 TDMS 文件这么慢?
- javascript - 预测在哪里?
- javascript - API Node.js + express,请求问题
- sql - 如果保存了 id,则从 SQL 表中获取字段的值成员
- reactjs - chrome中的ReactJS内存/存储泄漏