recherche
Maisonbase de donnéestutoriel mysql数据库中的行列转换

数据库中的行列转换

Jun 07, 2016 pm 03:29 PM
教师数据库查询系统转换问题

问题描述 在评教系统中查询教师成绩处涉及到了数据的行转列应用,首先介绍下行转列要解决的问题: 我们数据库中存储的数据结构类似为: 而最后我们要达到的查询效果为: 我们将课程列分成了三列,而对应的分数列的数据作为记录插入到了相应课程的后面。 功能



问题描述

在评教系统中查询教师成绩处涉及到了数据的行转列应用,首先介绍下行转列要解决的问题:

我们数据库中存储的数据结构类似为:

而最后我们要达到的查询效果为:

我们将课程列分成了三列,而对应的分数列的数据作为记录插入到了相应课程的后面。

功能来源

为什么会出现这样的需求呢?

数据库设计的过程中为了满足用户的动态要求(添加字段),可以采用定义字段名表,定义一个字段值的表,以达到用静态表达动态。也就是说以数据库表纵向的增加替代原有的横向延伸,即记录条数的增加替代字段增加。

这样的设计带来了灵活,但同时带来了统计分析的麻烦,因为统计分析时有可能需要显示字段展开的情况。如评教系统中的具体实现:

由于考核项目会进行动态的添加删除,因此设置的考核项目表,存储对教师的考核项目

而存储教师评教分数的表需要获取考核项目数据,存储图示为:

最终需要的显示效果是要将考核项目列为标题,而分值作为记录添加到对应的考核项目下。

此处我们我们通过将动态变化的考核项目作为新的表的记录来存储带来了设计的灵活性,而显示的时候却要进行行列的转换才能得到想要的结果。

具体实现

查找相关资料进行实现,明白了行转列又分成了静态和动态之分,静态的是不需要扩展的,很容易实现,而针对评教系统中的功能则是对应的动态实现。

针对第一个实例

1.通过执行字符串的拼接实现动态行转列

--变量按sql语言顺序赋值

declare @sql varchar(500)

set @sql = 'select 姓名'

select @sql = @sql+',max(case 课程 when '''+ 课程 +''' then 分数 else 0 end)['+课程+']'

from(select distinct 课程 from tb)a	--同from tb group by课程,默认按课程名排序

set @sql= @sql + ' from tb group by 姓名'

exec(@sql)

2.使用isnull、pivot函数

declare @sql varchar(8000)

--获得课程集合

select @sql=isnull(@sql+',','')+ 课程 from tb group by 课程           

set @sql='select * from tb pivot (max(分数) for 课程 in ('+@sql+')) a'

exec(@sql)

3.添加算总分、平均分的要求

declare @sql varchar(8000)

select @sql=isnull(@sql+',','')+ 课程 from tb group by 课程

set @sql='select m.* , n.总分,n.平均分 from

(select * from (select * from tb) a pivot (max(分数) for 课程 in ('+

 @sql+')) b) m ,

(select 姓名,sum(分数)总分, cast(avg(分数*1.0) as decimal(18,2)) 平均分 from tb group by 姓名) n

where m.姓名= n.姓名'

exec(@sql)

新得小结

虽然评教系统中已经实现了对行列数据的转换,但想要使用另外一种方法进行实现。进行了对行转列功能的搜索实现之后,在转接到评教系统上的应用上来还是碰到了很多问题,到现在仍没有完全解决,只得暂时先放一放了。对数据库的灵活设计也有了一定的体会,在考虑灵活性的同时也要考虑用户的体验度的。对行列互相转换的还是需要更多的思考呀。

Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Comment MySQL gère-t-il la réplication des données?Comment MySQL gère-t-il la réplication des données?Apr 28, 2025 am 12:25 AM

MySQL traite la réplication des données à travers trois modes: réplication asynchrone, semi-synchrone et de groupe. 1) Les performances de réplication asynchrones sont élevées mais les données peuvent être perdues. 2) La réplication semi-synchrone améliore la sécurité des données mais augmente la latence. 3) La réplication du groupe prend en charge la réplication et le basculement multi-maître, adaptés aux exigences de haute disponibilité.

Comment pouvez-vous utiliser l'instruction Explication pour analyser les performances de la requête?Comment pouvez-vous utiliser l'instruction Explication pour analyser les performances de la requête?Apr 28, 2025 am 12:24 AM

L'instruction Explication peut être utilisée pour analyser et améliorer les performances de la requête SQL. 1. Exécutez la déclaration Expliquez pour afficher le plan de requête. 2. Analyser les résultats de sortie, prêter attention au type d'accès, à l'utilisation d'index et à la commande de jointure. 3. Créer ou ajuster les index en fonction des résultats de l'analyse, optimiser les opérations de jointure et éviter la numérisation complète de la table pour améliorer l'efficacité de la requête.

Comment sauvegardez-vous et restaurez-vous une base de données MySQL?Comment sauvegardez-vous et restaurez-vous une base de données MySQL?Apr 28, 2025 am 12:23 AM

L'utilisation de MySQLDump pour la sauvegarde logique et MySQLenterPriseBackup pour la sauvegarde à chaud sont des moyens efficaces de sauvegarder les bases de données MySQL. 1. Utilisez MySQLDump pour sauvegarder la base de données: mysqldump-uot-pmydatabase> mydatabase_backup.sql. 2. Utilisez MySQLenterPriseBackup pour Hot Backup: MySqlBackup - User = root-patkword = mot de passe - Backup-Dir = / path / to / backupbackup. Lorsque vous récupérez, utilisez la vie correspondante

Quelles sont les causes communes de requêtes lentes dans MySQL?Quelles sont les causes communes de requêtes lentes dans MySQL?Apr 28, 2025 am 12:18 AM

Les principales raisons de la requête MySQL lente comprennent une utilisation manquante ou inappropriée des index, une complexité de requête, un volume de données excessif et des ressources matérielles insuffisantes. Les suggestions d'optimisation incluent: 1. Créer des index appropriés; 2. Optimiser les déclarations de requête; 3. Utiliser la technologie de partitionnement de la table; 4. Améliorer le matériel de manière appropriée.

Quelles sont les vues dans MySQL?Quelles sont les vues dans MySQL?Apr 28, 2025 am 12:04 AM

MySQL View est une table virtuelle basée sur les résultats de la requête SQL et ne stocke pas de données. 1) Les vues simplifient les requêtes complexes, 2) améliorent la sécurité des données et 3) la cohérence des données. Les vues sont des requêtes stockées dans des bases de données qui peuvent être utilisées comme des tables, mais les données sont générées dynamiquement.

Quelles sont les différences de syntaxe entre MySQL et d'autres dialectes SQL?Quelles sont les différences de syntaxe entre MySQL et d'autres dialectes SQL?Apr 27, 2025 am 12:26 AM

MySQLDIFFERSFromothersqlDialictsinsyntaxforlimit, auto-imprémentation, stringcomparison, sous-questionnaires et performanceanalysis.1) MySqluseSlimit, WhilesQlServerUseStopandorAnUseSrownum.2)

Qu'est-ce que le partitionnement MySQL?Qu'est-ce que le partitionnement MySQL?Apr 27, 2025 am 12:23 AM

Le partitionnement MySQL améliore les performances et simplifie la maintenance. 1) Diviser les grandes tables en petits morceaux par des critères spécifiques (tels que les gammes de dattes), 2) Divisez physiquement les données en fichiers indépendants, 3) MySQL peut se concentrer sur des partitions connexes lors de l'interrogation, 4) L'optimiseur de requête peut ignorer les partitions non liées, 5) le choix de la bonne stratégie de partition et le maintenir régulièrement est la clé.

Comment accordez-vous et révoquez-vous les privilèges dans MySQL?Comment accordez-vous et révoquez-vous les privilèges dans MySQL?Apr 27, 2025 am 12:21 AM

Comment accorder et révoquer les autorisations dans MySQL? 1. Utilisez la déclaration de subvention pour accorder des autorisations, telles que GrantallPrivilegesondatabase_Name.to'Username'@'host '; 2. Utilisez la déclaration de révocation pour révoquer les autorisations, telles que Revokeallprivilegesondatabase_name.from'username'@'host 'pour garantir la communication opportune des modifications d'autorisation.

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

PhpStorm version Mac

PhpStorm version Mac

Le dernier (2018.2.1) outil de développement intégré PHP professionnel

VSCode Windows 64 bits Télécharger

VSCode Windows 64 bits Télécharger

Un éditeur IDE gratuit et puissant lancé par Microsoft

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

MantisBT

MantisBT

Mantis est un outil Web de suivi des défauts facile à déployer, conçu pour faciliter le suivi des défauts des produits. Cela nécessite PHP, MySQL et un serveur Web. Découvrez nos services de démonstration et d'hébergement.

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel