首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求SQL语句合并查询结果,该怎么解决

2012-01-19 
求SQL语句合并查询结果数据标准为:SelectA01.A0128as部门,count(*)as人数,sum(GZ02.GZ0201)as基本薪金,sum

求SQL语句合并查询结果
数据标准为:
Select   A01.A0128   as   '部门 '
,count(*)   as   '人数 '
,sum(GZ02.GZ0201)   as   '基本薪金 '
,sum(GZ02.GZ0204)   as   '总加班费 '
,sum(GZ02.GZ0208)   as   '总津贴 '
,sum(GZ02.GZ0211)   as   '总奖金 '
,sum(GZ02.GZ0216)   as   '缺勤扣减薪金 '
,sum(GZ02.GZ0219)   as   '调整更改 '
,sum(GZ02.GZ0218)   as   '社会保险公司 '
,sum(GZ02.GZ0213)   as   '住房公积金(公司) '
,sum(GZ02.GZ0247)   as   '红海劳务费 '
from   GZ02
,A01
Where
(GZ02.A0188=A01.A0188)
and
left(gz02.gz_ym,4)   =     :统计年份  
and
right(gz02.gz_ym,2)= '01 '
group   by   A01.A0128

上面是一个月的记录,但是我想得到一年的记录,按月顺序依次往后排~

结果就像

,sum(GZ02.GZ0201)   as   '基本薪金 '
,sum(GZ02.GZ0204)   as   '总加班费 '
,sum(GZ02.GZ0208)   as   '总津贴 '
,sum(GZ02.GZ0211)   as   '总奖金 '
,sum(GZ02.GZ0216)   as   '缺勤扣减薪金 '
,sum(GZ02.GZ0219)   as   '调整更改 '
,sum(GZ02.GZ0218)   as   '社会保险公司 '
,sum(GZ02.GZ0213)   as   '住房公积金(公司) '
,sum(GZ02.GZ0247)   as   '红海劳务费 '
--后面接着
,sum(GZ02.GZ0201)   as   '基本薪金2月 '
,sum(GZ02.GZ0204)   as   '总加班费2月 '
,sum(GZ02.GZ0208)   as   '总津贴2月 '
,sum(GZ02.GZ0211)   as   '总奖金 '
,sum(GZ02.GZ0216)   as   '缺勤扣减薪金2月 '
,sum(GZ02.GZ0219)   as   '调整更改2月 '
,sum(GZ02.GZ0218)   as   '社会保险公司2月 '
,sum(GZ02.GZ0213)   as   '住房公积金(公司)2月 '
,sum(GZ02.GZ0247)   as   '红海劳务费2月 '
有没有什么直接的语句可以实现啊?不通过临时表



[解决办法]
Select A01.A0128 as '部门 '
,count(*) as '人数 '
,sum(case when right(gz02.gz_ym,2)= '01 ' then GZ02.GZ0201 else 0 end) as '基本薪金1月 '
,sum(case when right(gz02.gz_ym,2)= '01 ' then GZ02.GZ0204 else 0 end) as '总加班费1月 '
,sum(case when right(gz02.gz_ym,2)= '01 ' then GZ02.GZ0208 else 0 end) as '总津贴1月 '
,sum(case when right(gz02.gz_ym,2)= '01 ' then GZ02.GZ0211 else 0 end) as '总奖金1月 '
,sum(case when right(gz02.gz_ym,2)= '01 ' then GZ02.GZ0216 else 0 end) as '缺勤扣减薪金1月 '
,sum(case when right(gz02.gz_ym,2)= '01 ' then GZ02.GZ0219 else 0 end) as '调整更改1月 '
,sum(case when right(gz02.gz_ym,2)= '01 ' then GZ02.GZ0218 else 0 end) as '社会保险公司1月 '
,sum(case when right(gz02.gz_ym,2)= '01 ' then GZ02.GZ0213 else 0 end) as '住房公积金(公司)1月 '
,sum(case when right(gz02.gz_ym,2)= '01 ' then GZ02.GZ0247 else 0 end) as '红海劳务费1月 '

,sum(case when right(gz02.gz_ym,2)= '02 ' then GZ02.GZ0201 else 0 end) as '基本薪金2月 '
,sum(case when right(gz02.gz_ym,2)= '02 ' then GZ02.GZ0204 else 0 end) as '总加班费2月 '
,sum(case when right(gz02.gz_ym,2)= '02 ' then GZ02.GZ0208 else 0 end) as '总津贴2月 '
,sum(case when right(gz02.gz_ym,2)= '02 ' then GZ02.GZ0211 else 0 end) as '总奖金2月 '
,sum(case when right(gz02.gz_ym,2)= '02 ' then GZ02.GZ0216 else 0 end) as '缺勤扣减薪金2月 '
,sum(case when right(gz02.gz_ym,2)= '02 ' then GZ02.GZ0219 else 0 end) as '调整更改2月 '
,sum(case when right(gz02.gz_ym,2)= '02 ' then GZ02.GZ0218 else 0 end) as '社会保险公司2月 '
,sum(case when right(gz02.gz_ym,2)= '02 ' then GZ02.GZ0213 else 0 end) as '住房公积金(公司)2月 '


,sum(case when right(gz02.gz_ym,2)= '02 ' then GZ02.GZ0247 else 0 end) as '红海劳务费2月 '
--接着往后排3月,4月
from
,A01
Where
(GZ02.A0188=A01.A0188)
and
left(gz02.gz_ym,4) = 统计年份

group by A01.A0128



[解决办法]
是可以用语句做完一切。但是:

用编号作为列,可读性太差。至少要建个视图把列名先替换了,人不是机器,不能老拿来做 编号-〉真实意义 这样的翻译。

用“200708”表示 2007年8月,这样不好。分 年 月 两个字段比较合适。当数据达到百万级别时,你会为这种随意的字段付出代价。

热点排行