SQL 查询怎么将行变成列
表有三列,stunamem,subject score. 表中的数据有: 张三 语文 0 李四 语文 4 王二 英文 90 张三 数学 333 要求 查询 结果如下 学生 语文 英文 数学 张三 0 0 333 李四 4 0 0 没有分数的默认为0 求 查询 SQL 等楼下. 使用 case when SQL code /* 标题:普通
表有三列,stunamem,subject score.
表中的数据有:
张三 语文 0
李四 语文 4
王二 英文 90
张三 数学 333
要求查询结果如下
学生 语文 英文 数学
张三 0 0 333
李四 4 0 0
没有分数的默认为0
求查询SQL
等楼下.
使用 case when
SQL code
/*
标题:普通行列转换(version 2.0)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-03-09
地点:广东深圳
说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。
问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74 84 94
张三 74 83 93
-------------------
*/
create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go
--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
select 姓名 as 姓名 ,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理
from tb
group by 姓名
--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql)
--SQL SERVER 2005 静态SQL。
select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b
--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
set @sql = '[' + @sql + ']'
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')
---------------------------------
/*
问题:在上述结果的基础上加平均分,总分,得到如下结果:
姓名 语文 数学 物理 平均分 总分
---- ---- ---- ---- ------ ----
李四 74 84 94 84.00 252
张三 74 83 93 83.33 250
*/
--SQL SERVER 2000 静态SQL。
select 姓名 姓名,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理,
cast(avg(分数*1.0) as decimal(18,2)) 平均分,
sum(分数) 总分
from tb
group by 姓名
--SQL SERVER 2000 动态SQL。
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名'
exec(@sql)
--SQL SERVER 2005 静态SQL。
select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b) m,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名
--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
exec ('select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b) m ,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名')
drop table tb
------------------
------------------
/*
问题:如果上述两表互相换一下:即表结构和数据为:
姓名 语文 数学 物理
张三 74 83 93
李四 74 84 94
想变成(得到如下结果):
姓名 课程 分数
---- ---- ----
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93
--------------
*/
create table tb(姓名 varchar(10) , 语文 int , 数学 int , 物理 int)
insert into tb values('张三',74,83,93)
insert into tb values('李四',74,84,94)
go
--SQL SERVER 2000 静态SQL。
select * from
(
select 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 , 课程 = '物理' , 分数 = 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 end
--SQL SERVER 2000 动态SQL。
--调用系统表动态生态。
declare @sql varchar(8000)
select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [课程] = ' + quotename(Name , '''') + ' , [分数] = ' + quotename(Name) + ' from tb'
from syscolumns
where name! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名为姓名的其它列
order by colid asc
exec(@sql + ' order by 姓名 ')
--SQL SERVER 2005 动态SQL。
select 姓名 , 课程 , 分数 from tb unpivot (分数 for 课程 in([语文] , [数学] , [物理])) t
--SQL SERVER 2005 动态SQL,同SQL SERVER 2000 动态SQL。
--------------------
/*
问题:在上述的结果上加个平均分,总分,得到如下结果:
姓名 课程 分数
---- ------ ------
李四 语文 74.00
李四 数学 84.00
李四 物理 94.00
李四 平均分 84.00
李四 总分 252.00
张三 语文 74.00
张三 数学 83.00
张三 物理 93.00
张三 平均分 83.33
张三 总分 250.00
------------------
*/
select * from
(
select 姓名 as 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 as 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 as 姓名 , 课程 = '物理' , 分数 = 物理 from tb
union all
select 姓名 as 姓名 , 课程 = '平均分' , 分数 = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb
union all
select 姓名 as 姓名 , 课程 = '总分' , 分数 = 语文 + 数学 + 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 end
drop table tb
SQL code
create table #test (stunamem varchar(10),subject varchar(10),score int)
insert #test select '张三', '语文', 0
insert #test select '李四', '语文', 4
insert #test select '王二', '英文', 90
insert #test select '张三', '数学', 333
select stunamem,max(case when subject='语文' then score else 0 end)
,max(case when subject='英文' then score else 0 end)
,max(case when subject='数学' then score else 0 end)
from #test
group by stunamem
stunamem
---------- ----------- ----------- -----------
李四 4 0 0
王二 0 90 0
张三 0 0 333
(3 行受影响)
如果是2005的话,可以使用pivot函数。
SQL code
,[1996],[1997],[1998]
FROM dbo.Orders
PIVOT (
SUM(Quantity)
FOR [Year] IN ([1996],[1997],[1998])
)x
--结果:
CustomerID 1996 1997 1998
---------- ----------- ----------- -----------
ANTON 24 295 40
BONAP 181 486 313
BOTTM 81 454 421
更多请参考: SQL server 2005 PIVOT运算符的使用
[code=SQL]
USE tempdb
GO
SELECT YEAR(OrderDate) AS [Year]
,CustomerID
,od.Quantity
INTO dbo.Orders
FROM NorthWind..Orders AS o
JOIN NorthWind..[Order Details] AS od
ON o.OrderID = od.OrderID
WHERE o.CustomerID IN ( 'BONAP ', 'BOTTM ', 'ANTON ')
SELECT CustomerID
,[1996],[1997],[1998]
FROM dbo.Orders
PIVOT (
SUM(Quantity)
FOR [Year] IN ([1996],[1997],[1998])
)x
--结果:
CustomerID 1996 1997 1998
---------- ----------- ----------- -----------
ANTON 24 295 40
BONAP 181 486 313
BOTTM 81 454 421
[/code]

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

Sujets chauds



HQL et SQL sont comparés dans le framework Hibernate : HQL (1. Syntaxe orientée objet, 2. Requêtes indépendantes de la base de données, 3. Sécurité des types), tandis que SQL exploite directement la base de données (1. Normes indépendantes de la base de données, 2. Exécutable complexe requêtes et manipulation de données).

"Utilisation de l'opération de division dans OracleSQL" Dans OracleSQL, l'opération de division est l'une des opérations mathématiques courantes. Lors de l'interrogation et du traitement des données, les opérations de division peuvent nous aider à calculer le rapport entre les champs ou à dériver la relation logique entre des valeurs spécifiques. Cet article présentera l'utilisation de l'opération de division dans OracleSQL et fournira des exemples de code spécifiques. 1. Deux méthodes d'opérations de division dans OracleSQL Dans OracleSQL, les opérations de division peuvent être effectuées de deux manières différentes.

Oracle et DB2 sont deux systèmes de gestion de bases de données relationnelles couramment utilisés, chacun possédant sa propre syntaxe et ses propres caractéristiques SQL. Cet article comparera et différera la syntaxe SQL d'Oracle et de DB2, et fournira des exemples de code spécifiques. Connexion à la base de données Dans Oracle, utilisez l'instruction suivante pour vous connecter à la base de données : CONNECTusername/password@database Dans DB2, l'instruction pour vous connecter à la base de données est la suivante : CONNECTTOdataba.

Téléchargez la dernière version de l'application de réservation de billets 12306. C'est un logiciel d'achat de billets de voyage dont tout le monde est très satisfait. Il est très pratique d'aller où vous voulez. Il existe de nombreuses sources de billets fournies dans le logiciel. -authentification par nom pour acheter des billets en ligne. Tous les utilisateurs Vous pouvez facilement acheter des billets de voyage et des billets d'avion et profiter de différentes réductions. Vous pouvez également commencer à réserver à l'avance pour récupérer des billets. Vous pouvez réserver des hôtels ou des transferts spéciaux en voiture. Grâce à lui, vous pouvez aller où vous voulez et acheter des billets en un seul clic. Voyager est plus simple et plus pratique, ce qui rend l'expérience de voyage de chacun. plus confortable. Désormais, l'éditeur le détaille en ligne. Offre à 12306 utilisateurs un moyen de consulter l'historique des achats de billets. 1. Ouvrez Railway 12306, cliquez sur Mon dans le coin inférieur droit, puis cliquez sur Ma commande. 2. Cliquez sur Payé sur la page de commande. 3. Sur la page payante

Comment vérifier mes diplômes universitaires sur Xuexin.com ? Vous pouvez vérifier vos diplômes universitaires sur Xuexin.com. De nombreux utilisateurs ne savent pas comment vérifier leurs diplômes universitaires sur Xuexin.com. Ensuite, l'éditeur vous propose un didacticiel graphique sur la façon de vérifier vos diplômes universitaires sur Xuexin.com. les utilisateurs viennent jeter un oeil ! Tutoriel d'utilisation de Xuexin.com : Comment vérifier vos diplômes universitaires sur Xuexin.com 1. Entrée Xuexin.com : https://www.chsi.com.cn/ 2. Requête sur le site Web : Étape 1 : Cliquez sur l'adresse Xuexin.com ci-dessus pour accéder à la page d'accueil Cliquez sur [Requête sur l'éducation] ; Étape 2 : Sur la dernière page Web, cliquez sur [Requête] comme indiqué par la flèche dans la figure ci-dessous. Étape 3 : Cliquez ensuite sur [Connexion au fichier de crédits académiques] sur la nouvelle page ; Étape 4 : Sur la page de connexion, saisissez les informations et cliquez sur [Connexion] ;

Concurrence en technologie de base de données : quelles sont les différences entre Oracle et SQL ? Dans le domaine des bases de données, Oracle et SQL Server sont deux systèmes de gestion de bases de données relationnelles très respectés. Bien qu’elles appartiennent toutes deux à la catégorie des bases de données relationnelles, il existe de nombreuses différences entre elles. Dans cet article, nous examinerons les différences entre Oracle et SQL Server, ainsi que leurs fonctionnalités et avantages dans les applications pratiques. Tout d'abord, il existe des différences de syntaxe entre Oracle et SQL Server.

Si vous souhaitez vérifier la date d'activation à l'aide d'un téléphone mobile Apple, le meilleur moyen est de la vérifier via le numéro de série du téléphone mobile. Vous pouvez également la vérifier en visitant le site officiel d'Apple, en le connectant à un ordinateur et en en téléchargeant un troisième. -logiciel de fête pour le vérifier. Comment vérifier la date d'activation du téléphone mobile Apple Réponse : requête de numéro de série, requête sur le site officiel d'Apple, requête sur ordinateur, requête sur un logiciel tiers 1. La meilleure façon pour les utilisateurs est de connaître le numéro de série de leur téléphone mobile. le numéro de série en ouvrant Paramètres, Général, À propos de cette machine. 2. Grâce au numéro de série, vous pouvez non seulement connaître la date d'activation de votre téléphone mobile, mais également vérifier la version du téléphone mobile, l'origine du téléphone mobile, la date d'usine du téléphone mobile, etc. 3. Les utilisateurs visitent le site Web officiel d'Apple pour trouver une assistance technique, trouvent la colonne de service et de réparation en bas de la page et y vérifient les informations d'activation de l'iPhone. 4. Utilisateur

En tant que marque de sport de renommée mondiale, les chaussures Nike ont attiré beaucoup d'attention. Cependant, il existe également un grand nombre de produits contrefaits sur le marché, notamment de fausses boîtes à chaussures Nike. Distinguer les véritables boîtes à chaussures des fausses est crucial pour protéger les droits et les intérêts des consommateurs. Cet article vous fournira quelques méthodes simples et efficaces pour vous aider à faire la distinction entre les vraies et les fausses boîtes à chaussures. 1 : Titre de l'emballage extérieur En observant l'emballage extérieur des boîtes à chaussures Nike, vous pouvez découvrir de nombreuses différences subtiles. Les véritables boîtes à chaussures Nike contiennent généralement des matériaux en papier de haute qualité, doux au toucher et sans odeur âcre évidente. Les polices et les logos des boîtes à chaussures authentiques sont généralement clairs et détaillés, et il n'y a pas de flou ni d'incohérence de couleur. 2 : titre de marquage à chaud du logo. Le logo sur les boîtes à chaussures Nike est généralement imprimé à chaud. La partie de marquage à chaud sur la boîte à chaussures authentique s'affichera.
