按照姓名分组 MS SQL2000

DECLARE @t TABLE ([name] VARCHAR(20))

INSERT INTO @t

SELECT '全晓辉' UNION ALL
SELECT '全市的' UNION ALL
SELECT '第三代' UNION ALL
SELECT '撒地方' UNION ALL
SELECT '撒旦'

SELECT MAX(LEFT([name],1)) AS [name],COUNT(1) AS 'count' FROM @t GROUP BY LEFT([name],1) ORDER BY [count] DESC, [name] ASC

 

 

2011-06-25

### SQL 行列转换的语法与示例 #### 使用 `PIVOT` 实现行列转换 在关系型数据库中,`PIVOT` 是一种用于将行数据转换为列数据的技术。以下是基于不同数据库系统的具体实现方式。 对于 **Microsoft SQL Server** 的 `PIVOT` 示例: 假设有一个名为 `tbpivot` 的表,其中包含学生姓名 (`name`)、课程名 (`course`) 和分数 (`score`) 字段。可以通过以下语句实现行列转换: ```sql SELECT name, [语文], [数学], [物理] FROM ( SELECT name, course, score FROM tbpivot ) AS SourceTable PIVOT ( MAX(score) FOR course IN ([语文], [数学], [物理]) ) AS PivotTable; ``` 上述代码通过嵌套查询的方式实现了动态列转换[^1]。外部查询指定了需要展示的学生姓名以及各科成绩;内部查询提供了基础数据源。这里使用了 `MAX()` 聚合函数来获取每门课的最大分数[^3]。 #### 动态生成列名的情况 当目标列的数量不确定时,可以采用动态SQL构建完整的查询字符串。例如,在MS SQL Server环境下可编写如下脚本: ```sql DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX); -- 获取所有可能的课程列表并拼接成逗号分隔的形式 SET @columns = STUFF(( SELECT DISTINCT ',' + QUOTENAME(course) FROM tbpivot FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, ''); -- 构建最终执行的SQL命令 SET @sql = ' SELECT * FROM ( SELECT name, course, score FROM tbpivot ) AS SourceTable PIVOT ( MAX(score) FOR course IN (' + @columns + ') ) AS PivotTable;'; EXEC sp_executesql @sql; ``` 这段程序先计算出所有的课程名称作为新的列头,再将其插入到标准的 `PIVOT` 查询模板里完成整个过程[^2]。 #### 处理常见错误提示 需要注意的是,在某些场景下可能会遇到因非枢轴列被加入到了不必要的 `GROUP BY` 条件而导致的运行异常。这是因为即使未显式写出 `GROUP BY` 子句,实际上系统也会自动应用它来进行分组运算。因此解决办法就是移除那些多余的字段声明。 #### UNPIVOT 反向操作 相对应于 `PIVOT` 将多条记录压缩至单一行中的多个属性而言,`UNPIVOT` 则负责把宽表格拉伸成长形结构以便进一步分析或者存储优化之需。下面给出一个简单的例子说明如何利用 MySQL 完成这一任务: ```sql SELECT id, subject, mark FROM grades UNPIVOT(mark FOR subject IN (Maths, Science)); ``` 在这里我们假定原表叫做 `grades`, 包含三栏分别是学生的唯一标识符(`id`), 数学成绩(Maths),科学成绩(Science)[^4]. ### 注意事项总结 - 必须明确指定参与变换的具体数值集合。 - 应选用合适的聚集算法处理原始资料集内的重复项。 - 对缺失值情况有所预见,并合理安排其表现形式,默认为空白(NULL)。 - 明确区分两种互逆动作各自的适用场合及其相互间联系差异之处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值