sql交叉表查询
㈠ sql 交叉表是个什么概念
就是笛卡尔积啊!R表x行n列,S表y行m列,得到的交叉表是x*y行,(m+n)列
㈡ 计算机二级题:交叉表查询能否通过SQL查询创建
在SQL 中所谓的交叉表,通俗点说,就是我们所说的行转列,都是这么理解的。 交叉表又分为,动态交叉表,静态交叉表,反转交叉表, 静态交叉表,一般用CASE实现 反转交叉表,一般用PIVOT实现 动态交叉表,好像只能用存储。
㈢ SQL 交叉表查询问题
典型的竖表转横表。你去网上搜一下,很多这样的代码。
这个我之前有遇到过。想写一个sql直接实现,发现写起来比较麻烦。最后,我直接用程序来实现。
先查询出所有人名和科目,这里可以用distinct。
接着建立一张二维表,列索引为人名,横索引为学科,假设表名是dataTable,则dataTable[name][subject] 存储的该科成绩。
这么做不会太难,时间复杂度是O(N),N为记录的条数。不过如果数据多,空间上开销肯定不行的。
而对于稀疏的表,这方法很不好。
不过因为我做的系统当时人数不到500,科目也不到20,就是可以承受的。
大数据的我也不知道怎么做。
㈣ sql语句中交叉报表的使用
DECLARE@sNVARCHAR(4000)
SELECT@s=ISNULL(@s+',','')+QUOTENAME(标志)
FROM表
---行列转换
DECLARE@SQLNVARCHAR(4000)
SELECT@SQL='
SELECT*
FROM表(带有转换标志)PIVOT(SUM(实际需要字段)
for[标志]in('+@s+')
)A'
EXEC(@SQL)
㈤ SqlServer如何生成动态交叉表查询
这里指的交叉表,就是象Access的交叉表查询一样的效果,比如Employees表中City字段代表了城市的名称,TitleOfCourtesy代表称呼,我们希望按照City和TitleOfCourtesy的情况来统计ReportsTo字段的合计数(本统计没有任何实际意义,只是挑选一些记录包含重复内容的字段来说明情况),并显示成以下格式:(TitleOfCourtesy作为行,City作为列) ,�0�2�0�2SUM(CASE�0�2City�0�2WHEN�0�2'Redmond'�0�2THEN�0�2ReportsTo�0�2ELSE�0�2NULL�0�2END)�0�2AS�0�2[Redmond�0�2City] ,�0�2�0�2SUM(CASE�0�2City�0�2WHEN�0�2'Seattle'�0�2THEN�0�2ReportsTo�0�2ELSE�0�2NULL�0�2END)�0�2AS�0�2[Seattle�0�2City]FROM�0�2Employees�0�2GROUP�0�2BY�0�2TitleOfCourtesy 其中利用了CASE语句判断,如果是相应的列,则取需要统计的ReportsTo数值,否则取NULL,然后再合计 其中有两个常见问题说明一下: a、用NULL而不用0是有道理的,假如用0,虽然求和函数SUM可以取到正确的数,但类似COUNT函数(取记录个数),结果就不对了,因为Null不算一条记录,而0要算,同理空字串("")也是这样,总之在这里应该用NULL,这样任何函数都没问题。 b、假如在视图的设计界面保存以上的查询,则会报错“没有输出列”,从而无法保存,其实只要在查询前面加上一段:Create View ViewName AS ...,ViewName是你准备给查询起的名称,...就是我们的查询,然后运行一下,就可以生成视图了,对于其他一些设计器不支持的语法,也可以这样保存。 总体思路其实很简单,首先检索列头信息,形成一个游标,然后遍历游标,将上面查询语句里Case判断的内容用游标里的值替代,形成一条新的Sql查询,然后执行,返回结果,就可以了,以下是我写的一个存储过程,供大家参考:CREATE�0�2procere�0�2CorssTab�0�2 @strTabName�0�2as�0�2varchar(50)�0�2=�0�2'Employees' ,�0�2--此处放表名@strCol�0�2as�0�2varchar(50)�0�2=�0�2'City' ,�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2--表头分组依据字段@strGroup�0�2as�0�2varchar(50)�0�2=�0�2'TitleOfCourtesy',--分组字段@strNumber�0�2as�0�2varchar(50)�0�2=�0�2'ReportsTo' ,�0�2�0�2�0�2�0�2--被统计的字段@strSum�0�2as�0�2varchar(10)�0�2=�0�2'Sum'�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2--运算方式ASDECLARE�0�2@strSql�0�2as�0�2varchar(1000 ),�0�2@strTmpCol�0�2as�0�2varchar(100)EXECUTE�0�2('DECLARE�0�2corss_cursor�0�2CURSOR�0�2FOR�0�2SELECT�0�2DISTINCT�0�2'�0�2+�0�2@strCol�0�2+�0�2'�0�2from�0�2'�0�2+�0�2@strTabName�0�2+�0�2'�0�2for�0�2read�0�2only�0�2')�0�2--生成游标begin�0�2�0�2SET�0�2nocount�0�2ON�0�2�0�2�0�2SET�0�2@strsql�0�2='select�0�2'�0�2+�0�2@strGroup�0�2+�0�2' ,�0�2'�0�2+�0�2@strSum�0�2+�0�2'('�0�2+�0�2@strNumber�0�2+�0�2')�0�2AS�0�2['�0�2+�0�2@strSum�0�2+�0�2'�0�2of�0�2'�0�2+�0�2@strNumber�0�2+�0�2']'�0�2--查询的前半段�0�2�0�2OPEN�0�2corss_cursor�0�2�0�2while�0�2(0=0)�0�2�0�2BEGIN�0�2�0�2�0�2�0�2FETCH�0�2NEXT�0�2FROM�0�2corss_cursor�0�2--遍历游标,将列头信息放入变量@strTmpCol �0�2�0�2�0�2�0�2INTO�0�2@strTmpCol�0�2�0�2�0�2�0�2if�0�2(@@fetch_status<0)�0�2break�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2SET�0�2@strsql�0�2=�0�2@strsql�0�2+�0�2' ,�0�2'�0�2+�0�2@strSum�0�2+�0�2'(CASE�0�2'�0�2+�0�2@strCol�0�2+�0�2'�0�2WHEN�0�2'''�0�2+�0�2@strTmpCol�0�2+�0�2'''�0�2THEN�0�2'�0�2+�0�2@strNumber�0�2+�0�2'�0�2ELSE�0�2Null�0�2END)�0�2AS�0�2['�0�2+�0�2@strTmpCol�0�2+�0�2'�0�2'�0�2+�0�2@strCol�0�2+�0�2']'�0�2--构造查询�0�2�0�2END�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2SET�0�2@strsql�0�2=�0�2@strsql�0�2+�0�2'�0�2from�0�2'�0�2+�0�2@strTabname�0�2+�0�2'�0�2group�0�2by�0�2'�0�2+�0�2@strGroup�0�2--查询结尾�0�2�0�2EXECUTE(@strsql)�0�2--执行�0�2�0�2IF�0�2@@error�0�2<0�0�2RETURN�0�2@@error�0�2--如果出错,返回错误代码�0�2�0�2CLOSE�0�2corss_cursor�0�2�0�2�0�2DEALLOCATE�0�2corss_cursor�0�2RETURN�0�20�0�2--释放游标,返回0表示成功endGO几点说明:a、这是一个通用存储过程,使用时@strTabName、@strCol、@strGroup、@strNumber、@strSum几个变量设置一下就可以用到其他表上,其中结果集的第二列我加了个合计列 b、为了测试方便,我在存储过程中设置了默认值,就是前面提到的Employees表,这样直接运行时就可以出来我上面提到的结果。 c、使用时,可以把上面的代码复制到企业管理器的查询设计界面Sql窗格,或者查询分析器里运行一下(注意正确选择NorthWind数据库),就可以生成一个存储过程:CorssTab,然后直接运行CorssTab,如果出现本文前面类似的窗格,就表示运行成功了。 d、假如用于其它表,首先需要在你的用户数据库里生成此存储过程(当然也可以放到Master里,然后再加个变量:@DataBase,赋值为数据库名称,然后在上面代码打开指定数据库,这样所有的数据库都可以调用它),当你调用时,采取以下格式:
㈥ 如何用SQL语句实现交叉表查询
一种是在Where条件中少写条件
mysql有一个cross join
㈦ 怎么使用SQL创建名为学生成绩表_交叉表的查询要用的字段有学号,姓名,课程名称,成绩
create table 学生成绩表 as select 学号,姓名,课程名称,成绩 from table1,table2
select后字段前加表别名
㈧ 关于SQL Server交叉表的查询问题
select identity(int,1,1) as id,,* from (
select name,N'数学' as subject,数学 as Source from a
union
select name,N'英语' as subject,英语 as Source from a
union
select name,N'语文' as subject,语文 as Source from a )c
order by c.source
㈨ SQL中的交叉表查询,来个稍微复杂点的例子吧
select d.name as clientname,c.prono,sum(a.ck_kg) as ck_kg,sum(a.ck_pcs) as ck_pcs,0 as fd_kg,0 as fd_pcs,trunc(b.docdate) as docdate from pl_cpch_line a
join pl_cpch b on A.CPCH_ID=b.cpch_id
join v_pl_scrk_line c on a.scrk_line_id=c.scrk_line_id
join bd_client d on b.client_id=d.client_id
group by d.name,c.prono,b.docdate
够复杂了吧
㈩ 怎么用SQL语句写交叉表啊
select a.学号,a.姓名,a.成绩 flash成绩,b.成绩 dw成绩,c.成绩 asp成绩
from 表 a left join 表 b on a.学号=b.学号 and a.课程名>b.课程名
left join 表 c on a.学号=c.学号 and a.课程名>c.课程名
and b.课程名>c.课程名
where c.成绩 is not null