我有一个查询,显示表中的重复行。现在,我一直坚持如何将另一个表中的数据字段添加到我的查询中。
SELECT
T1.lname, T1.fname, T1.rtg_id
FROM
(SELECT
lname, fname, rtg_id
FROM
cpmd b
GROUP BY
lname, fname, rtg_id
HAVING
COUNT(*) >= 2) T1
JOIN
cpmd T2 ON T1.lname = T2.lname
AND T1.fname = T2.fname
AND T1.rtg_id= T2.rtg_id
ORDER BY
lname, fname
这导致以下结果:(我在实际查询中删除了id,只是在这里显示给你)
md_id lname fname rtg_id
------------------------------
9901 Smith John 12300
9902 Smith John 12300
9903 Lee Bob 45600
9904 Lee Bob 45600
我需要获取每个人的电话号码和传真号码。有些记录虽然名称相同,但可能有不同的电话和传真号码。所以我需要这样的东西:
md_id lname fname rtg_id Home Fax
-------------------------------------------------------------
9901 Smith John 12300 (654) 5894676 (231) 7684353
9902 Smith John 12300 (546) 4576369 NULL
9903 Lee Bob 45600 (654) 9844576 (234) 2835657
9904 Lee Bob 45600 (778) 6780853 NULL
这两个表格包含电话类型和电话号码。
cpmd_phone
表:
md_id phone_id phone_type
------------------------------
9901 90 FAX
9901 91 HOME
9902 92 FAX
9902 93 HOME
9903 94 FAX
9903 95 HOME
9904 96 FAX
9904 97 HOME
csphone
表
phone_id area_code phone_no
---------------------------------
90 231 7684353
91 654 5894676
92 null null
93 546 4576369
94 234 2835657
95 654 9844576
96 null null
97 778 6780853
这是我到目前为止所做的,但它没有正常工作。有时它显示2个重复,有时它只显示1个记录..
SELECT
T1.lname, T1.fname, T1.asmdid, T1.rtg_id, t1.Phone, T1.Fax
FROM
(SELECT
lname, fname, rtg_id,
MIN(b.md_id) AS asmdid,
MIN(CASE WHEN (d.phone_type_cn = 2)
THEN '(' + e.area_code + ') ' + e.phone_no
ELSE NULL
END) AS Phone,
MIN(CASE WHEN (d.phone_type_cn = 4)
THEN '(' + e.area_code + ') ' + e.phone_no
ELSE NULL
END) AS Fax
FROM
cpmd b
JOIN
cpmd_phone d on b.md_id = d.md_id
JOIN
csphone e ON d.phone_id = e.phone_id
GROUP BY
lname, fname, rtg_id
HAVING
COUNT(*) >= 2) T1
JOIN
cpmd T2 ON T1.lname = T2.lname
AND T1.fname = T2.fname
AND T1.rtg_id = T2.rtg_id
AND T1.asmdid <> T2.md_id
ORDER BY
lname, fname
答案 0 :(得分:1)
听起来像一个案例陈述和一些联接......
SELECT
T1.lname,
T1.fname,
T1.rtg_id,
Home = max(case when ph.phone_type = 'HOME' then '(' + cast(cs.area_code as char(3)) + ') ' + cast(cs.phone_no as char(7)) end),
Fax = max(case when ph.phone_type = 'FAX' then '(' + cast(cs.area_code as char(3)) + ') ' + cast(cs.phone_no as char(7)) end)
FROM
(SELECT lname, fname, rtg_id
FROM cpmd b
GROUP BY lname, fname, rtg_id
HAVING COUNT(*) >= 2) T1
JOIN cpmd T2 ON
T1.lname = T2.lname
AND T1.fname = T2.fname
AND T1.rtg_id= T2.rtg_id
LEFT JOIN cpmd_phone ph ON
PH.md_id = t2.md_id
LEFT JOIN csphone cs ON
cs.phone_id = ph.phone_id
GROUP BY
T1.lname,
T1.fname,
T1.rtg_id,
ORDER BY lname, fname