数量库行转列的sql语句(zt)

    
其实想想是遵照前面这种格局的,关键的地点就是通过动态生成sql语句,然后实施之。

题材讲述
借使有张学生战绩表(CJ)如下
Name Subject Result
张三 语文 80
张三 数学 90
张三 物理 85
李四 语文 85
李四 数学 92
李四 物理 82

    declare @s nvarchar(1000)
select @s = ‘select [name] as 姓名’
select @s = @s + ‘,sum(case when subject=”’ + cast(subject as varchar)

       1.创造数据表,录入数据

         
重要考虑便是把职务分成两步,第2步:把第②列生成出来。第②步:依据第③列每行的真名取值,查询该同学的各科战绩join到第②步生成的唯有一列表。distinct不可能不难。

    c.要善于分析难点的症结所在,即吸引难题的原形。

       
衡量那个难题化解好坏大家有几个正经:1.当数码正好就是地方那个样午时,解决办法能还是无法获取不错的解;2.只要扩大科目了学科的品种,消除方法是不是还是能够行得通;3.假若有点人的某们课程的战表还从未下来,换言之,数据库中不是各种人每门课的成就都得以找到,数据库缺乏有些人某门课的大成的笔录。在那种气象下程序还能够否赢得客观的结果。

       3.较好的点子

自个儿得到

   
那么些题材权且就说到那里,之所以把稿子写出来是遵照几个目标,首先,作为学习心得,不敢独享,希望更加多的人能从中得到启示。其次,简单的难点也饱含众多奥秘的知识,希望越来越多的国手能投入斟酌,分析本文的不当之处,并付诸更好的章程,恐怕提供越来越多的近乎的例证,本文希望起到一得之见的成效。

      
首先介绍下行转列的定义,恐怕书上并不曾这些概念,行转列说的是如此一类题材:有时候为了多少库表的规划满意用户的动态供给(比如添加字段),大家选用定义字段名表,然后定义两个字段值的表,那样就直达了用静态来发挥动态,换句话说正是把数据库表中本来应该是横向的拉开转化为纵向的延长,再换句话说就是把数据库表中本来应该是字段的扩充转化为记录条数的充实。然则,在这么设计下,即便灵活,确带来了计算分析的勤奋,因为计算分析时,应该是以直观的款型展开表现。换言之,总结分析时,我们又应当显得为字段越来越多的那种。假如同时做到了多少存款和储蓄时列的增多转化为行的扩张,数据提取时又可获得列扩张了的多寡,数据库表的那种设计就对用户透明了。

     通过可视化界面或然用insert语句录入数据

        CREATE TABLE [dbo].[CJ](
[name] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[subject] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[result] [int] NULL,
CONSTRAINT [PK_CJ] PRIMARY KEY CLUSTERED
(
[name] ASC,
[subject] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

标题分析

         select distinct c.[name] as 姓名,
(select result from CJ where [name] = c.[name] and subject = ‘语文’
)as 语文,
(select result from CJ where [name] = c.[name] and subject = ‘数学’
)as 数学,
(select result from CJ where [name] = c.[name] and subject = ‘物理’
)as 物理
from CJ c

     2.第陆个最直白,最不难易行的做法

  • subject。用了group
    by就会化解扫描的频率难点,因为sum是测算的每种分组之类的。本办法的技能之处在于case
    when的利用。

转载:http://www.cnblogs.com/Charles2008/archive/2008/03/04/1090162.html

      该办法大约思想相近前一种。最大的一字不苟是用了group by,由于用了group
by后字段名除了group
by的可怜别的不能够直接用,加了个集函数,实际上这些Sum只会加一项,因为那一个表的主键是name

     
先不管标准2,想想能还是不可能一挥而就不行扫描的频率难点。于是得到了下边包车型大巴方法。

     今后正是怎么消除subject“由死到活”的题材。想到了一种方法如下:

   
a.认真的分析3个简便的难题的前后是很有含义的作业,浮躁的学风会让你开销多量的时刻结果一无所获。

       本试验选取MS SQL Server 贰零零陆条件测试。

      select   [name] as 姓名,
sum(case when subject=’语文’ then result end) as 语文,
sum(case when subject=’数学’ then result end) as 数学,
sum(case when subject=’物理’ then result end) as 物理
from CJ group by [name]

试验进度

       
本文前面建议的这些题材正是多少个典型的在数据提取时要把以行扩大格局的数目转载为以列扩大情势的数码。为何这么说吧?大家注意subject字段,subject里的始末在数据仓库储存款和储蓄时是以分裂数据行的款型,换言之,是以行增添的样式,而输出时,那其间的始末我们要变为字段名了。

      4.较完善的点子

       
那是个并不复杂的题材,但却是数据库中央银行转列的三个第一名事例,只要把那个抽象出来的保有普遍意义的难点研商透彻,别的类似的错综复杂问题化解。

SQL Server,商量意义

今昔 想写 sql 语句     查询后结果 为   
姓名 语文 数学 物理
张三 80 90 85
李四 85 92 82       该怎么落到实处 ?

  • ”’ then result end) as ‘ + subject from CJ group by subject
    select @s = @s + ‘ from CJ group by [name]’
    exec(@s)

    在@s的首先次累加中的代码中一句from CJ group by
subject非凡有技巧性,可知简单的select * from table t where ..
也是那般变化无穷,不得不叹服sql或然说关系型数据库的灵性。

         
该格局可以形成该职务,但只可以满意前文所述的评头品足标准1和标准3。当科目增多只怕实际上科目没有那样多时总计的结果就不那么完美了。换言之,那种艺术是静态的,将课程在sql语句里写死了。此外中间的多少个sql语句询问效能就好像并不那么高,还亟需扫描整个表,实际上应该只须要在1个学员对应的几条记下里找就足以了。

       这几个艺术还是不可能满意标准2。

写到最终

测验环境

   
b.消除1个标题要有明显的笔触,在一代不明白完美的答案时,可准备一步一步优化,向周到的取向靠拢。

相关文章