【发布时间】:2017-06-06 12:14:21
【问题描述】:
我想合并一些行。
首先,我的表和数据存在如下
GRP CRRO_NO TYPE_CD TYPE_ID
PERSON 1111 FATHER Tom
PERSON 1111 MOTHER Jennifer
PERSON 1111 JOB_ Teacher
PERSON 1111 FRIEND Jimmy
PERSON 1111 FRIEND Kim
PERSON 1111 FRIEND Michael
我想得到类似的结果
GRP CRRO_NO FATHER MOTHER JOB_ FRIEND
PERSON 1111 Tom Jennifer Teacher Jimmy
PERSON 1111 Tom Jennifer Teacher Kim
PERSON 1111 Tom Jennifer Teacher Michael
遇到这种情况,SQL怎么写?
我一直在尝试
SELECT T1.GRP_CD GRP, T1.CRRO_NO CRRO
, MAX(T1.MOTHER) MOTHER, MAX(T1.FATHER) FATHER, MAX(T1.JOB_) JOB, T1.FRIEND FRIEND
FROM (
SELECT DISTINCT
GRP_CD
,CRRO_NO
,CASE WHEN TYPE_CD = 'FATHER' THEN TYPE_ID ELSE '' END FATHER
,CASE WHEN TYPE_CD = 'MOTHER' THEN TYPE_ID ELSE '' END MOTHER
,CASE WHEN TYPE_CD = 'JOB_' THEN TYPE_ID ELSE '' END JOB_
,CASE WHEN TYPE_CD = 'FRIEND' THEN TYPE_ID ELSE '' END FRIEND
FROM TMP
WHERE 1=1 AND TRIM(CRRO_NO) = '1111'
) T1
WHERE T1.CRRO_NO = '1111'
GROUP BY T1.GRP_CD, T1.CRRO_NO, T1.FRIEND
;
那么,上面sql的结果就是
GRP CRRO_NO MOTHER FATHER JOB FRIEND
PERSON 1111 Jennifer Tom Teacher (null)
PERSON 1111 (null) (null) (null) Jimmy
PERSON 1111 (null) (null) (null) Kim
PERSON 1111 (null) (null) (null) Michael
现在我知道为什么我的查询结果是错误的(不是我想要的),但我仍然找不到方法。
实际上,有严格的规则来区分哪些是重复的(母亲、父亲、工作),哪些不是(朋友)
由于某些原因,我无法修改表的结构。 (我已将这个问题的内容从我的业务条款中更改并简化了情况来解释)
请提供任何建议再试一次
【问题讨论】:
-
您是否尝试在 FRIEND 列上使用 max 将其从组中取出?
-
@JorgeCampos 是的,我试过了,但是行数应该是三,因为有三个朋友。
-
那么您的解决方案将是您的实际查询的内部联接与像
select ...... where TYPE_CD ='FRIEND'这样的朋友的子查询,此联接将为您提供 3 个结果...试试看。哦,你的查询不需要那个 '1=1' (我知道这可能来自一个懒惰的程序员不想检查每个先前条件 =D 的应用程序) -
@JorgeCampos 谢谢,我正在尝试您的建议。