27,581
社区成员




SELECT 部门,姓名,(CASE 签收日期 WHEN NULL THEN '未签收' ELSE '已签收' END) AS 是否已签收
FROM 表A LEFT JOIN 表B
ON 表A.部门 = 表B.部门
/*
两个表分别记录人员信息(表A)和文件签收信息(表B),数据如下:
表A
部门 姓名
——————————
建设部 张三
工程部 李四
项目部 王五
建设部 赵六
项目部 牛七
表B
部门 姓名 签收日期
——————————————
建设部 张三 2008-1-10
工程部 李四 2008-1-20
项目部 王五 2008-1-16
问题:如何写sql得到下面的结果
部门 姓名 是否已签收
——————————————
建设部 张三 已签收
工程部 李四 已签收
项目部 王五 已签收
建设部 赵六 未签收
项目部 牛七 未签收
*/
/**
if object_id('tableA') is not NULL
drop table tableA
Go
create table tableA (部门 varchar(20),姓名 varchar(20))
Go
insert into tableA
select '建设部','张三' UNION ALL
select '工程部','李四' UNION ALL
select '项目部','王五' UNION ALL
select '建设部','赵六' UNION ALL
select '项目部','牛七'
if object_id('tableB') is not NULL
drop table tableB
Go
create table tableB (部门 varchar(20),姓名 varchar(20),签收日期 varchar(20))
Go
insert into tableB
select '建设部','张三','2008-1-10' UNION ALL
select '工程部','李四','2008-1-20' UNION ALL
select '项目部','王五','2008-1-16'
**/
select a.部门,a.姓名,case when len(b.签收日期) >=1 then '已签收' else '未签收' end 是否已签收
from tableA a
left join tableB b on a.部门=b.部门 and a.姓名=b.姓名
/***
部门 姓名 是否已签收
建设部 张三 已签收
工程部 李四 已签收
项目部 王五 已签收
建设部 赵六 未签收
项目部 牛七 未签收
***/
select a.*,(case when isnull(a.簽收日期,'無')='無' then '未簽收' else '已簽收' end) as 是否已簽收
from 表A a left join 表B on (a.部門=b.部門 and a.姓名=b.姓名)
---------------------------------
-- Author: liangCK 小梁
---------------------------------
--> 生成测试数据: @表A
DECLARE @表A TABLE (部门 VARCHAR(6),姓名 VARCHAR(4))
INSERT INTO @表A
SELECT '建设部','张三' UNION ALL
SELECT '工程部','李四' UNION ALL
SELECT '项目部','王五' UNION ALL
SELECT '建设部','赵六' UNION ALL
SELECT '项目部','牛七'
--> 生成测试数据: @表B
DECLARE @表B TABLE (部门 VARCHAR(6),姓名 VARCHAR(4),签收日期 DATETIME)
INSERT INTO @表B
SELECT '建设部','张三','2008-1-10' UNION ALL
SELECT '工程部','李四','2008-1-20' UNION ALL
SELECT '项目部','王五','2008-1-16'
--SQL查询如下:
SELECT
A.*,
CASE WHEN B.部门 IS NULL AND B.姓名 IS NULL THEN '未签收' ELSE '已签收' END AS 是否已签收
FROM @表A AS A
LEFT JOIN @表B AS B
ON A.部门=B.部门
AND A.姓名=B.姓名
/*
部门 姓名 是否已签收
------ ---- ------
建设部 张三 已签收
工程部 李四 已签收
项目部 王五 已签收
建设部 赵六 未签收
项目部 牛七 未签收
(5 行受影响)
*/
SELECT A.*, ISNULL(B.签收日期,'未签收') FROM TA A LEFT JOIN TB B ON A.部门 =B.部门