SQL Server 作業練習2(JOIN、子查詢)

第一題--找出缺勤者:

有一員工表.結構如下
EmployeeID Name
------------------
1001 張三
1002 李四
1003 王五
另有一張員工出勤刷卡表
EmployeeID Date
----------------------
1001 2007/03/24
1002 2007/03/24
1003 2007/03/24
1001 2007/03/25
1002 2007/03/25
1001 2007/03/26
1003 2007/03/26

從上面可以看出..員工王五在2007/03/25沒有刷卡.李四在2007/03/26沒有刷卡.
所以我想得出如下的資訊:
EmployeeID Date
-----------------------
1003 2007/03/25
1002 2007/03/26



=======================================================
CREATE TABLE #員工
(
  員工編號 VARCHAR(4),
  姓名 NVARCHAR(10)
)
go

CREATE TABLE #出缺勤
(
  員工編號 VARCHAR(4),
  日期 DATE
)
go

INSERT INTO #員工 VALUES('1001','張三')
INSERT INTO #員工 VALUES('1002','李四')
INSERT INTO #員工 VALUES('1003','王五')

INSERT INTO #出缺勤 VALUES('1001','2007/03/24')
INSERT INTO #出缺勤 VALUES('1002','2007/03/24')
INSERT INTO #出缺勤 VALUES('1003','2007/03/24')
INSERT INTO #出缺勤 VALUES('1001','2007/03/25')
INSERT INTO #出缺勤 VALUES('1002','2007/03/25')
INSERT INTO #出缺勤 VALUES('1001','2007/03/26')
INSERT INTO #出缺勤 VALUES('1003','2007/03/26')

說明:
這題我用的思考方式是
1.先找出正常出缺勤表該有的樣子
2.找出不存在正常出缺勤表中的人,即該日沒有出現

我這個有瑕疵,正常日期的取得應該用別方式
如果某日為正常上班日,但所有員工都沒來打卡或打卡機壞了
那該日的出缺勤表為空,日期不存在
=======================================================
SELECT B.員工編號 AS EmployeeID
    ,CONVERT(VARCHAR(10),A.日期,111) AS Date
FROM (SELECT DISTINCT 日期 FROM #出缺勤) AS A
 CROSS JOIN (SELECT 員工編號 FROM #員工) AS B
WHERE NOT EXISTS 
  (SELECT 員工編號,日期 FROM #出缺勤
   WHERE A.日期 = 日期 AND B.員工編號 = 員工編號)

第二題--找出單號最大者:

KK001 1
KK001 2
KK001 3
KK001 4
KK002 1
KK002 2
KK002 3
變成↓↓↓↓↓
KK001 4
KK002 3

=======================================================
CREATE TABLE #T1
(
  單號 VARCHAR(5),
  次數 INT,
  內容 NVARCHAR(10)
)

INSERT INTO #T1 VALUES('aa001', 1, '測')
INSERT INTO #T1 VALUES('aa001', 2, '測試')
INSERT INTO #T1 VALUES('aa001', 3, '測試完')
INSERT INTO #T1 VALUES('aa001', 4, '測試完成')
INSERT INTO #T1 VALUES('aa002', 1, '實')
INSERT INTO #T1 VALUES('aa002', 2, '實驗')
INSERT INTO #T1 VALUES('aa002', 3, '實驗完')
INSERT INTO #T1 VALUES('aa002', 4, '實驗完成')
INSERT INTO #T1 VALUES('aa003', 1, '驗')
INSERT INTO #T1 VALUES('aa003', 2, '驗證')
INSERT INTO #T1 VALUES('aa003', 3, '驗證完')

這題還算簡單
1.找出最大筆
1.自已查自已
=======================================================
SELECT A.單號,A.內容
FROM #T1 AS A
WHERE EXISTS 
  (SELECT 單號,MAX(次數) AS 最大次數
   FROM #T1 
   GROUP BY 單號
   HAVING A.次數 = MAX(次數) AND A.單號 = 單號)

留言

熱門文章