SQL2000如何实现两表联合查询并生成交叉表

SQL2000如何实现两表联合查询并生成交叉表,第1张

你的意识是通过Table1的2,3和Table2的1,2进行关联,对(Table1字段4+Table2字段4)在(Table1字段1和Table2字段3)上进行分组统计 最后行列转换成最后那个表

是这个意思吧

没有直接的转换方法,建议这样:

select 货号,品名=dboshfcoltostr(货号) from TABLENAME

输出结果

货号    品名

1        A ,           AB,         ABB    

2        B ,           BC

前题条件:在查询分析器中执行建立以下自定义函数

CREATE function shfColToStr

(@HH varchar(18))

returns varchar(5000)

begin

declare @result varchar(5000)

select @result=isnull(@result+',','')+品名 from TABLENAME where 货号=@HH 

return @result

end

go

OK 了没有啊?

好吧,再给你一个方法,与你的要求分毫不差:

需要先根据品名或品名ID生成一个按货号分组的序号,存到临时表,以最多10个品名为例:

临时表生成:

SELECT ,SN=(SELECT COUNT(1) FROM TABLENAME A WHERE A品名>=tablename品名 and a货号=tablename货号) into #tablename FROM TABLENAME

看看这个临时表,多出了一个SN(序号),然后用下面的语句查询:

select DISTINCT t货号,

品名1=isnull((select top 1 a品名 from #tablename a where a货号=t货号 and asn=1),''),

品名2=isnull((select top 1 a品名 from #tablename a where a货号=t货号 and asn=2),''),

品名3=isnull((select top 1 a品名 from #tablename a where a货号=t货号 and asn=3),''),

品名4=isnull((select top 1 a品名 from #tablename a where a货号=t货号 and asn=4),''),

品名5=isnull((select top 1 a品名 from #tablename a where a货号=t货号 and asn=5),''),

品名6=isnull((select top 1 a品名 from #tablename a where a货号=t货号 and asn=6),''),

品名7=isnull((select top 1 a品名 from #tablename a where a货号=t货号 and asn=7),''),

品名8=isnull((select top 1 a品名 from #tablename a where a货号=t货号 and asn=8),''),

品名9=isnull((select top 1 a品名 from #tablename a where a货号=t货号 and asn=9),''),

品名10=isnull((select top 1 a品名 from #tablename a where a货号=t货号 and asn=10),'')

from #tablename t

看上去复杂,写起来容易,只需复制  复制 <品名n=sn=n>10次,然后改品名后缀和SN值即可。

结果:

货号 品名1 品名2 品名3 品名4 品名5 品名6 品名7 品名8 品名9 品名10 

1    A     AB    ABB    

2    B     BC

左右连接其实就是以哪个表为主(或者说为准),结果集为“主表”的全部记录+“副表”与“主表”相匹配的记录,如果“副表”中没有和“主表”相匹配的记录,则相对应的记录显示为NULL

左连接:左边表全部行+右边表相匹配的行,如果左边表中的某一行,在右边表中没有匹配的行,则显示NULL(left join 或者left outer join)

右连接:和左连接相反。(right join 或者right outer join)

内连接:它返回字段ID(连接条件)同时存在于两个表中的记录,也就是说,仅当至少有一个同属于两表的行符合联接条件时,内联接才返回行,内联接消除与另一个表中的任何行不匹配的行。(inner join或者join)

全连接:不管匹配不匹配,全部都显示出来。(full join或者full outer join)

交叉连接:没有WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(cross join不带where)

自连接:给自己取个别名,一个表当两个表来使用。

再把另外的表字段给出来就更好了,

如果不合适就自己改吧,最关键的一点是要将成绩表旋转,列转行。

=================

如果这样的话,这个查询就用不上科目表了,如下即可

select a科目,a代课教师,sum(c成绩) 总分,avg(c成绩) 均分,

sum(case when c成绩>=60 then 1 else 0 end)/count() 及格率,

sum(case when c成绩>=80 then 1 else 0 end)/count() 优秀率

from 代课教师表 a,

(select '语文' as 科目,语文 as 成绩 from 成绩表

union all

select '数学' as 科目,数学 as 成绩 from 成绩表

union all

select '英语' as 科目,英语 as 成绩 from 成绩表) c

where a科目名称=c科目

group by a科目,a代课教师

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 csource

兄弟,再描述清楚一点,我没看懂想干嘛

你看这样能行么

SELECT styleid, sum(set_nums),sizeid FROM table_name GROUP BY sizeid

以上就是关于SQL2000如何实现两表联合查询并生成交叉表全部的内容,包括:SQL2000如何实现两表联合查询并生成交叉表、SQLServer中的交叉查询、数据库交叉连接的连接过程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9778562.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存