收录日期:2021/03/03 01:30:30 时间:2016/06/09 10:27:04 标签:疑难问题
现在我有两个表,从里边取得数据,如下所示:
--这是第1个表
员工编号 月份     年份     描叙1              合计1
40212983 04 2005 HRS ABS          8740.00
40212983 04 2005 OTHERS          -30999.78
40251280 04 2005 EDUCATION DEDU 202.66
40251280 04 2005 RESIGN DEDU 2.69

--这是第2个表
员工编号 月份     年份     描叙2                       合计2
40212983 04 2005 RETRENCHMENT           100.00
40212983 04 2005 MEAL                    20.00
40251280 04 2005 SAL-IN-LIEU*           200.00
40251280 04 2005 UNCONSUMED A/L           100.00
(注:取得上面两个结果集条件是:月份为4月,年份为2005年)

--现在我想在报表里显示如下结果:
员工编号 月份 年份  描叙1            合计1     描叙2          合计2
40212983 04   2005   HRS ABS           8740.00   RETRENCHMENT   100.00     
40212983 04   2005   OTHERS           -30999.78 MEAL           20.00
40251280 04   2005   EDUCATION DEDU   202.66    SAL-IN-LIEU*   200.00
40251280 04   2005   RESIGN DEDU      2.69      UNCONSUMED A/L 100.00
两表关联条件是:员工编号,月份,年份都一致
请问各位改怎么办
顶起,急等高手~
还有没有别的字段了?员工编号,月份,年份都相同的还有两条怎么确定哪一条对应那一条?
select a.员工编号,a.月份,a.年份,描叙1,合计1,描叙2,合计2
from 1表 a
inner join 2表 b on a.员工编号=b.员工编号 and a.月份=b.月份 and a.年份=b.年份
条件就怎么多,不能解决么?
To gahade(沙果):
你这个方法我昨天就试了,结果是8条,而我要的只是4条结果
select * from a  join b on a.员工编号=b.员工编号 and a.月份=b.月份 and a.年份=b.年份
1表和2表是条条对应的吗?
如果是的话可以先在每个表生成一个自增列id,再按id关联。
这里我还漏了一个
还有一个表3,查询结果如下:
员工编号 月份     年份    姓名 
40212983 04 2005    Lulu
40251280 04 2005    Jack
这三个表进行关联:员工编号,月份,年份都一致
然后最终结果就是刚才我已列出的结果再加姓名就是
To gahade(沙果):
你说的办法,应该怎么弄?
楼主条件还是不够。。。
按照现在的情况如果单纯用连接的话肯定会出问题。
1表和2表条数一样并且是条条对应的吗?
create table 表1(员工编号 varchar(10),月份 varchar(10),年份 varchar(10),描叙1 varchar(20),合计1 numeric(20,6))
insert into 表1
select '40212983','04','2005','HRS ABS',8740.00
union all select '40212983','04','2005','OTHERS',-30999.78
union all select '40251280','04','2005','EDUCATION DEDU',202.66
union all select '40251280','04','2005','RESIGN DEDU',2.69

create table 表2(员工编号 varchar(10),月份 varchar(10),年份 varchar(10),描叙2 varchar(20),合计2 numeric(20,6))
insert into 表2
select '40212983','04','2005','RETRENCHMENT',100.00
union all select '40212983','04','2005','MEAL',20.00
union all select '40251280','04','2005','SAL-IN-LIEU*',200.00
union all select '40251280','04','2005','UNCONSUMED A/L',100.00

select identity(int,1,1) as id,* into 表11 from 表1
select identity(int,1,1) as id,* into 表22 from 表2

select 表11.员工编号,表11.月份,表11.年份,描叙1,合计1,描叙2,合计2 from 表11
inner join 表22 on 表11.id=表22.id
CREATE TABLE ta([员工编号] varchar(10), [月份] varchar(2), [年份] varchar(4), [描叙1] varchar(20), [合计1] money)
INSERT INTO ta
    SELECT  '40212983', '04', '2005', 'HRS ABS', 8740.00
    UNION ALL SELECT '40212983', '04', '2005', 'OTHERS', -30999.78
    UNION ALL SELECT '40251280', '04', '2005', 'EDUCATION DEDU', 202.66
    UNION ALL SELECT '40251280', '04', '2005', 'RESIGN DEDU', 2.69

CREATE TABLE tb([员工编号] varchar(10), [月份] varchar(2), [年份] varchar(4), [描叙2] varchar(20), [合计2] money)
INSERT INTO tb
    SELECT  '40212983', '04', '2005', 'RETRENCHMENT', 100.00
    UNION ALL SELECT '40212983', '04', '2005', 'MEAL', 20.00
    UNION ALL SELECT '40251280', '04', '2005', 'SAL-IN-LIEU*', 200.00
    UNION ALL SELECT '40251280', '04', '2005', 'UNCONSUMED A/L', 100.00

SELECT 员工编号, 月份, 年份, 描叙1, 合计1, 0 AS FLG INTO #TA FROM ta
SELECT 员工编号, 月份, 年份, 描叙2, 合计2, 0 AS FLG INTO #TB FROM tb

DECLARE @BH VARCHAR(10), @M VARCHAR(2), @Y VARCHAR(4), @I INT
SELECT @BH = '', @M = '', @Y = '', @I = 0
UPDATE #TA
SET @I = CASE WHEN @BH = 员工编号 AND @M = 月份 AND @Y = 年份 THEN @I + 1 ELSE 1 END,
    FLG = @I, @BH = 员工编号, @M = 月份, @Y = 年份
    
SELECT @BH = '', @M = '', @Y = '', @I = 0
UPDATE #TB
SET @I = CASE WHEN @BH = 员工编号 AND @M = 月份 AND @Y = 年份 THEN @I + 1 ELSE 1 END,
    FLG = @I, @BH = 员工编号, @M = 月份, @Y = 年份

--考虑表一与表二记录数不对应的情况,比如表一中40212983只有一条记录
SELECT CASE WHEN A.员工编号 IS NOT NULL THEN A.员工编号 ELSE B.员工编号 END AS 员工编号,
CASE WHEN A.月份 IS NOT NULL THEN A.月份 ELSE B.月份 END AS 月份,
CASE WHEN A.年份 IS NOT NULL THEN A.年份 ELSE B.年份 END AS 年份,
A.描叙1, A.合计1, B.描叙2, B.合计2
FROM #TA A FULL JOIN #TB B
ON A.员工编号 = B.员工编号 AND A.月份 = B.月份 AND A.年份 = B.年份 AND A.FLG = B.FLG

--如果两表中,同一个员工编号肯定有相同的记录条数,就这样写
SELECT A.员工编号, A.月份, A.年份, A.描叙1, A.合计1, B.描叙2, B.合计2
FROM #TA A FULL JOIN #TB B
ON A.员工编号 = B.员工编号 AND A.月份 = B.月份 AND A.年份 = B.年份 AND A.FLG = B.FLG

DROP TABLE ta, tb, #TA, #TB
第二种情况用Inner Join就可以了,不用Full join
我试下
不是一一对应,刚才我试了下,表1由于条件变更,变成多条了,不与表2对应了
不对应时楼主想要什么结果。我写的那个什么地方还不符合要求?
LZ所生成的这两个表的连结会出问题,就算沙果和火虫再能写,也未必会有满意的结果.
因此,在生成这两个表的查询中,就已经应该为这两个表制订相应的连接条件,也就是说生成
这两个表的其他几个表应该只有一两个表不同.因此就应该根据有关的条件为所产生的这两
个新的表建立关键字,从而才可以联结.
    因此建议LZ将几个表的结构和生成这两个表的过程贴出来.应该不是什么大问题.只是
单凭这两个表,再生成结果,除非你将数据固定下来.否则会形成笛卡儿连接.
declare @表1 table (员工编号 varchar(10),月份 varchar(10),年份 varchar(10),描叙1 varchar(20),合计1 numeric(20,6))
insert into @表1
select '40212983','04','2005','HRS ABS',8740.00
union all select '40212983','04','2005','OTHERS',-30999.78
union all select '40251280','04','2005','EDUCATION DEDU',202.66
union all select '40251280','04','2005','RESIGN DEDU',2.69

declare @表2 table(员工编号 varchar(10),月份 varchar(10),年份 varchar(10),描叙2 varchar(20),合计2 numeric(20,6))
insert into @表2
select '40212983','04','2005','RETRENCHMENT',100.00
union all select '40212983','04','2005','MEAL',20.00
union all select '40251280','04','2005','SAL-IN-LIEU*',200.00
union all select '40251280','04','2005','UNCONSUMED A/L',100.00
select a.员工编号,a.月份,a.年份,描叙1,合计1,描叙2,合计2
from 
(select *,记录1=
(select count(*) from @表1 
where 员工编号=b.员工编号 and 月份=b.月份 and 年份=b.年份 and 合计1!>b.合计1 )
from @表1 b)a
inner join 
(select *,记录2=(select count(*) from  @表2 
where 员工编号=b.员工编号 and 月份=b.月份 and 年份=b.年份 and 合计2!>b.合计2) 
from  @表2 b)b on
a.员工编号=b.员工编号 and a.月份=b.月份 and a.年份=b.年份 and 记录1=记录2
order by 记录1 desc

(所影响的行数为 4 行)


(所影响的行数为 4 行)

员工编号       月份         年份         描叙1                  合计1                    描叙2                  合计2                    
---------- ---------- ---------- -------------------- ---------------------- -------------------- ---------------------- 
40212983   04         2005       HRS ABS              8740.000000            RETRENCHMENT         100.000000
40251280   04         2005       EDUCATION DEDU       202.660000             SAL-IN-LIEU*         200.000000
40251280   04         2005       RESIGN DEDU          2.690000               UNCONSUMED A/L       100.000000
40212983   04         2005       OTHERS               -30999.780000          MEAL                 20.000000

(所影响的行数为 4 行)

用嵌套的方法
重命名表
结果如下:
40212983 04 2005 HRS ABS 8740.000000 RETRENCHMENT 100.000000
40251280 04 2005 EDUCATION DEDU 202.660000 SAL-IN-LIEU* 200.000000
40251280 04 2005 RESIGN DEDU 2.690000 UNCONSUMED A/L 100.000000
40212983 04 2005 OTHERS -30999.780000 MEAL 20.000000
declare @表1 table (员工编号 varchar(10),月份 varchar(10),年份 varchar(10),描叙1 varchar(20),合计1 numeric(20,6))
insert into @表1
select '40212983','04','2005','HRS ABS',8740.00
union all select '40212983','04','2005','OTHERS',-30999.78
union all select '40251280','04','2005','EDUCATION DEDU',202.66
union all select '40251280','04','2005','RESIGN DEDU',2.69

declare @表2 table(员工编号 varchar(10),月份 varchar(10),年份 varchar(10),描叙2 varchar(20),合计2 numeric(20,6))
insert into @表2
select '40212983','04','2005','RETRENCHMENT',100.00
union all select '40212983','04','2005','MEAL',20.00
union all select '40251280','04','2005','SAL-IN-LIEU*',200.00
union all select '40251280','04','2005','UNCONSUMED A/L',100.00
select a.员工编号,a.月份,a.年份,描叙1,合计1,描叙2,合计2
from 
(select *,记录1=
(select count(*) from @表1 
where 员工编号=b.员工编号 and 月份=b.月份 and 年份=b.年份 and 合计1!>b.合计1 )
from @表1 b)a
inner join 
(select *,记录2=(select count(*) from  @表2 
where 员工编号=b.员工编号 and 月份=b.月份 and 年份=b.年份 and 合计2!>b.合计2) 
from  @表2 b)b on
a.员工编号=b.员工编号 and a.月份=b.月份 and a.年份=b.年份 and 记录1=记录2
order by a.员工编号,记录1 desc

增加一个员工编号排序就行了

(所影响的行数为 4 行)


(所影响的行数为 4 行)

员工编号       月份         年份         描叙1                  合计1                    描叙2                  合计2                    
---------- ---------- ---------- -------------------- ---------------------- -------------------- ---------------------- 
40212983   04         2005       HRS ABS              8740.000000            RETRENCHMENT         100.000000
40212983   04         2005       OTHERS               -30999.780000          MEAL                 20.000000
40251280   04         2005       EDUCATION DEDU       202.660000             SAL-IN-LIEU*         200.000000
40251280   04         2005       RESIGN DEDU          2.690000               UNCONSUMED A/L       100.000000

(所影响的行数为 4 行)
以上结果为
40212983 04 2005 HRS ABS 8740.000000 RETRENCHMENT 100.000000
40212983 04 2005 OTHERS -30999.780000 MEAL 20.000000
40251280 04 2005 EDUCATION DEDU 202.660000 SAL-IN-LIEU* 200.000000
40251280 04 2005 RESIGN DEDU 2.690000 UNCONSUMED A/L 100.000000


roy_88(论坛新星_燃烧你的激情!!

你可真费劲.虽然结果好像是出来了.
LZ去验证吧.但我总觉得舍本求末的感觉.在生成这几个表的时候多费
点神,会将代码缩小到几行吧...LZ应该搞定了.买单.
--用创建事务的方式统计(不用创建临时表),上面的方法为合计1、合计2没有相同的记录,如果有相同记录。
--只有以下方法统计
declare @表1 table (员工编号 varchar(10),月份 varchar(10),年份 varchar(10),描叙1 varchar(20),合计1 numeric(20,6))
insert into @表1
select '40212983','04','2005','HRS ABS',8740.00
union all select '40212983','04','2005','OTHERS',-30999.78
union all select '40251280','04','2005','EDUCATION DEDU',202.66
union all select '40251280','04','2005','RESIGN DEDU',2.69

declare @表2 table(员工编号 varchar(10),月份 varchar(10),年份 varchar(10),描叙2 varchar(20),合计2 numeric(20,6))
insert into @表2
select '40212983','04','2005','RETRENCHMENT',100.00
union all select '40212983','04','2005','MEAL',20.00
union all select '40251280','04','2005','SAL-IN-LIEU*',200.00
union all select '40251280','04','2005','UNCONSUMED A/L',100.00

begin tran
select *,id= identity(int,1,1) into #a
from @表1 order by 合计1 desc
select 员工编号,月份,年份,描叙1,合计1,
记录1=(select count(*) from #a  where 员工编号=a.员工编号 and 月份=a.月份 and  年份= a.年份 and id!>a.id)
into #ta
from #a a
select * ,id= identity(int,1,1) into #b
from @表2 order by 合计2 desc
select 员工编号,月份,年份,描叙2,合计2,
记录2=(select count(*) from #b  where 员工编号=a.员工编号 and 月份=a.月份 and  年份= a.年份 and id!>a.id)
into #tb
from #b a
select a.员工编号,a.月份,a.年份,描叙1,合计1,描叙2,合计2
from #ta a inner join #tb b on 
a.员工编号=b.员工编号 and a.月份=b.月份 and a.年份=b.年份 and 记录1=记录2
order by a.员工编号,记录1 asc
rollback tran


(所影响的行数为 4 行)


(所影响的行数为 4 行)


(所影响的行数为 4 行)


(所影响的行数为 4 行)


(所影响的行数为 4 行)


(所影响的行数为 4 行)

员工编号       月份         年份         描叙1                  合计1                    描叙2                  合计2                    
---------- ---------- ---------- -------------------- ---------------------- -------------------- ---------------------- 
40212983   04         2005       HRS ABS              8740.000000            RETRENCHMENT         100.000000
40212983   04         2005       OTHERS               -30999.780000          MEAL                 20.000000
40251280   04         2005       EDUCATION DEDU       202.660000             SAL-IN-LIEU*         200.000000
40251280   04         2005       RESIGN DEDU          2.690000               UNCONSUMED A/L       100.000000

(所影响的行数为 4 行)

用创建事务可以省删创建表的过程

贫困大学生的大学生活 我建立了一个群,主要用于探讨HTML,DHTML,CSS,JAVASCRIPT,FLASH,DREAMWEAVER,PHOTOSHOP技术,希望从事这方面工作的同志加入 求寻找二叉树子结点的父结点的递规算法?多谢! 如何在aspx中调用.cs中的变量 为什么我电脑一开机就自动关闭电源?? 急:怎么写这个递归函数?在线等待. 关于视频在线播放的问题 请大家推荐几本ORACLE的入门经典图书... 哪里有C#做的服务程序供下载,及说明? 菜鸟问题,ASA数据库换了路径要怎么设置才能用??????? 为何点击Button,不执行Button_Click里面的事件了? 求高手帮忙,菜鸟就此先谢过~~~ 我从来没有遇到的问题,看看大家谁知道怎么解决?文件夹打开就是乱码! MYSQL连接问题 哪里有C#开发服务程序的资料? Domino下Servlet的配置问题!!! 为什么我的程序在打印预览的时候 经过反复的狂刷会出现 单文档视图类GetDC结果为空的现象 ?? 请问一个基础的问题,关于arcinfo 收集经典语句,可以肉麻,可以幽默,可以深奥,五花八门,UP没分 在首页如何调用外部的javascript程序?就是不让首页的源程序过长 求一条按日期(以周为单位)分类汇总的SQL语句! 高分悬赏,不够再加:可以实现这样的显示格式吗?datagrid,datalist,repeater 100分求问简单问题!!怎么把某一文件夹下图片文件打开并全部显示出来? <神经病帮>---欧洲宇航局的科学假说土卫6将在20亿年后出现生命,我十分想看看那时的生命是什么样子,怎么办? 寻找java练习题.......50分,马上给分 计算机人的福星----健康和美丽 急:怎么写这个递归函数?在线等待... 文件 倒计时不能修改 Manage C++,C++/CLI,和C++?