假设有A、B、C、D四个表  A         B        C D
-----     -----     -----     ----- 
opp_dn    opp_dn    opp_dn    opp_dn
 110        110       112       112
 112        112       120       120
 114        114执行下面SQL语句: SELECT tmpT.opp_dn,
MAX(CASE WHEN tmpT.Flag = 'B' THEN 1 ELSE ' ' END) AS A,
MAX(CASE WHEN tmpT.Flag = 'B' THEN 1 ELSE ' ' END) AS B, 
        MAX(CASE WHEN tmpT.Flag = 'C' THEN 1 ELSE ' ' END) AS C,
        MAX(CASE WHEN tmpT.Flag = 'C' THEN 1 ELSE ' ' END) AS D
FROM (
SELECT A.*, 'A' AS Flag FROM A
UNION ALL
SELECT B.*, 'B' AS Flag FROM B
UNION ALL
SELECT C.*, 'C' AS Flag FROM C
UNION ALL
SELECT D.*, 'D' AS Flag FROM D
) tmpT GROUP BY tmpT.opp_dn下面是结果集:Opp     A       B       C       D   
----- -------------------------------
110  1 1 0 0
112 1 1 1 1
113 0 0 0 0
114 1 1 0 0
120 0 0 1 1我想如何显示关联四个表opp_dn相同字段值之间关联度大于2的结果集,例如:Opp     A       B       C       D   
---- -------------------------------
112 1 1 1 1
110  1 1
114 1 1
120 1 1

解决方案 »

  1.   

    SELECT tmpT.opp_dn,
    MAX(CASE WHEN tmpT.Flag = 'A' THEN 1 ELSE ' ' END) AS A,
    MAX(CASE WHEN tmpT.Flag = 'B' THEN 1 ELSE ' ' END) AS B, 
            MAX(CASE WHEN tmpT.Flag = 'C' THEN 1 ELSE ' ' END) AS C,
            MAX(CASE WHEN tmpT.Flag = 'D' THEN 1 ELSE ' ' END) AS D
    FROM (
    SELECT A.*, 'A' AS Flag FROM A
    UNION ALL
    SELECT B.*, 'B' AS Flag FROM B
    UNION ALL
    SELECT C.*, 'C' AS Flag FROM C
    UNION ALL
    SELECT D.*, 'D' AS Flag FROM D
    ) tmpT GROUP BY tmpT.opp_dn
      

  2.   

    create table A(opp_dn int)
    insert A select 110
    union all select 112
    union all select 114create table B(opp_dn int)
    insert B select 110
    union all select 112
    union all select 114create table C(opp_dn int)
    insert C select 112
    union all select 120create table D(opp_dn int)
    insert D select 112
    union all select 120 SELECT tmpT.opp_dn,
    MAX(CASE WHEN tmpT.Flag = 'A' THEN 1 ELSE ' ' END) AS A,
    MAX(CASE WHEN tmpT.Flag = 'B' THEN 1 ELSE ' ' END) AS B, 
            MAX(CASE WHEN tmpT.Flag = 'C' THEN 1 ELSE ' ' END) AS C,
            MAX(CASE WHEN tmpT.Flag = 'D' THEN 1 ELSE ' ' END) AS D
    FROM (
    SELECT A.*, 'A' AS Flag FROM A
    UNION ALL
    SELECT B.*, 'B' AS Flag FROM B
    UNION ALL
    SELECT C.*, 'C' AS Flag FROM C
    UNION ALL
    SELECT D.*, 'D' AS Flag FROM D
    ) tmpT GROUP BY tmpT.opp_dn--result
    opp_dn      A           B           C           D           
    ----------- ----------- ----------- ----------- ----------- 
    110         1           1           0           0
    112         1           1           1           1
    114         1           1           0           0
    120         0           0           1           1(4 row(s) affected)
      

  3.   

    我搞错了。A表应该还有一个数值为113!!
    create table A(opp_dn int)
    insert A select 110
    union all select 112
    union all select 114
    union all select 113
      

  4.   


    create table A(opp_dn int)
    insert A select 110
    union all select 112
    union all select 114
    union all select 113create table B(opp_dn int)
    insert B select 110
    union all select 112
    union all select 114create table C(opp_dn int)
    insert C select 112
    union all select 120create table D(opp_dn int)
    insert D select 112
    union all select 120 SELECT tmpT.opp_dn,
    MAX(CASE WHEN tmpT.Flag = 'A' THEN 1 ELSE ' ' END) AS A,
    MAX(CASE WHEN tmpT.Flag = 'B' THEN 1 ELSE ' ' END) AS B, 
            MAX(CASE WHEN tmpT.Flag = 'C' THEN 1 ELSE ' ' END) AS C,
            MAX(CASE WHEN tmpT.Flag = 'D' THEN 1 ELSE ' ' END) AS D
    FROM (
    SELECT A.*, 'A' AS Flag FROM A
    UNION ALL
    SELECT B.*, 'B' AS Flag FROM B
    UNION ALL
    SELECT C.*, 'C' AS Flag FROM C
    UNION ALL
    SELECT D.*, 'D' AS Flag FROM D
    ) tmpT GROUP BY tmpT.opp_dn having count(*)>1--result
    opp_dn      A           B           C           D           
    ----------- ----------- ----------- ----------- ----------- 
    110         1           1           0           0
    112         1           1           1           1
    114         1           1           0           0
    120         0           0           1           1(4 row(s) affected)
      

  5.   

    谢谢兄台,另外再问下,如果表A,再多有一个重复值110,例如:create table A(opp_dn int)
    insert A select 110
    union all select 110
    union all select 112
    union all select 114
    union all select 113应该如何实现下面的结果呢?opp_dn      A           B           C           D           
    ----------- ----------- ----------- ----------- ----------- 
    110         2           1           0           0
    112         1           1           1           1
    114         1           1           0           0
    120         0           0           1           1
      

  6.   

    create table A(opp_dn int)
    insert A select 110
    union all select 110
    union all select 112
    union all select 114
    union all select 113create table B(opp_dn int)
    insert B select 110
    union all select 112
    union all select 114create table C(opp_dn int)
    insert C select 112
    union all select 120create table D(opp_dn int)
    insert D select 112
    union all select 120 SELECT tmpT.opp_dn,
    sum(CASE WHEN tmpT.Flag = 'A' THEN 1 ELSE 0 END) AS A,
    sum(CASE WHEN tmpT.Flag = 'B' THEN 1 ELSE 0 END) AS B, 
        sum(CASE WHEN tmpT.Flag = 'C' THEN 1 ELSE 0 END) AS C,
        sum(CASE WHEN tmpT.Flag = 'D' THEN 1 ELSE 0 END) AS D
    FROM (
    SELECT A.*, 'A' AS Flag FROM A
    UNION ALL
    SELECT B.*, 'B' AS Flag FROM B
    UNION ALL
    SELECT C.*, 'C' AS Flag FROM C
    UNION ALL
    SELECT D.*, 'D' AS Flag FROM D
    ) tmpT GROUP BY tmpT.opp_dn having count(*)>1--result
    opp_dn      A           B           C           D           
    ----------- ----------- ----------- ----------- ----------- 
    110         2           1           0           0
    112         1           1           1           1
    114         1           1           0           0
    120         0           0           1           1(4 row(s) affected)