--这是第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
两表关联条件是:员工编号,月份,年份都一致
请问各位改怎么办
from 1表 a
inner join 2表 b on a.员工编号=b.员工编号 and a.月份=b.月份 and a.年份=b.年份
你这个方法我昨天就试了,结果是8条,而我要的只是4条结果
如果是的话可以先在每个表生成一个自增列id,再按id关联。
还有一个表3,查询结果如下:
员工编号 月份 年份 姓名
40212983 04 2005 Lulu
40251280 04 2005 Jack
这三个表进行关联:员工编号,月份,年份都一致
然后最终结果就是刚才我已列出的结果再加姓名就是
你说的办法,应该怎么弄?
按照现在的情况如果单纯用连接的话肯定会出问题。
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
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
因此,在生成这两个表的查询中,就已经应该为这两个表制订相应的连接条件,也就是说生成
这两个表的其他几个表应该只有一两个表不同.因此就应该根据有关的条件为所产生的这两
个新的表建立关键字,从而才可以联结.
因此建议LZ将几个表的结构和生成这两个表的过程贴出来.应该不是什么大问题.只是
单凭这两个表,再生成结果,除非你将数据固定下来.否则会形成笛卡儿连接.
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
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
你可真费劲.虽然结果好像是出来了.
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
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 行)
贫困大学生的大学生活