现有三表A,B,C结构如下A.ID 为主键对应B.USERID,C.USERID
A:ID,DESC    B:ID,MSG,ISGOOD,USERID  C:ID,USERID
21,好东西     1,'我要',  1,22        1,23
22,新产品     2,'不好',  0,22        2,23
23,进口       3,'啥玩意',0,22        3,23
24,国产       4,'YESHA', 1,21        4,21
26,不明       5,'不评价',1,23        5,23
              6,'谢谢x', 1,22        6,21
                                       7,23
                                       8,24
希望求出的表如下:注:该商品好评数(b.ISGOOD=1为好评)和被点击次数,如BC两表无记录则不选出
a.id ,  b.(商品好评数ISGOOD=1), c.(被点击次数)
21          1                     2
22          2                     null
23          1                     5
24          null                  1

解决方案 »

  1.   

    B,C两表先分别group by,然后full join,之后和A join.
      

  2.   


    declare @A table (ID int,[DESC] varchar(6))
    insert into @A
    select 21,'好东西' union all
    select 22,'新产品' union all
    select 23,'进口' union all
    select 24,'国产' union all
    select 26,'不明'declare @B table (ID int,MSG varchar(6),ISGOOD int,USERID int)
    insert into @B
    select 1,'我要',1,22 union all
    select 2,'不好',0,22 union all
    select 3,'啥玩意',0,22 union all
    select 4,'YESHA',1,21 union all
    select 5,'不评价',1,23 union all
    select 6,'谢谢x',1,22declare @C table (ID int,USERID int)
    insert into @C
    select 1,23 union all
    select 2,23 union all
    select 3,23 union all
    select 4,21 union all
    select 5,23 union all
    select 6,21 union all
    select 7,23 union all
    select 8,24select aa.*,bb.点击数 from 
    (select a.id,好评数=sum(case when b.ISGOOD=1 then 1 else 0 end) from @A a
    full join @B b on a.ID=b.USERID group by a.id
    ) aa left join 
    (select a.id,点击数=count(c.ID) from @A a
    full join @C c on a.ID =c.USERID group by a.id
    ) bb on aa.id=bb.id
    /*
    id          好评数         点击数
    ----------- ----------- -----------
    21          1           2
    22          2           0
    23          1           5
    24          0           1
    26          0           0
    */
      

  3.   

    SELECT A.USERID,B,C
    FROM (
    SELECT ISNULL(T1.USERID, T2.USERID) AS USERID, B, C
    FROM (SELECT USERID,COUNT(*) AS B FROM B GROUP BY USERID) T1
    FULL JOIN 
    (SELECT USERID,COUNT(*) AS C FROM C GROUP BY USERID) T2
      ON T1.USERID=T2.USERID
    ) T JOIN A ON A.USERID=T.USERID
      

  4.   

    --借用楼上数据
    SELECT T.USERID,B,C
    FROM (
    SELECT ISNULL(T1.USERID, T2.USERID) AS USERID, B, C
    FROM (SELECT USERID,SUM(ISGOOD) AS B FROM @B GROUP BY USERID) T1
    FULL JOIN 
    (SELECT USERID,COUNT(*) AS C FROM @C GROUP BY USERID) T2
      ON T1.USERID=T2.USERID
    ) T JOIN @A AS A ON A.ID=T.USERID
    ORDER BY T.USERID
    /*
    USERID      B           C
    ----------- ----------- -----------
    21          1           2
    22          2           NULL
    23          1           5
    24          NULL        1
    */
      

  5.   


    -----演示环境
    CREATE TABLE T1(ID INT,DE VARCHAR(20))
    INSERT INTO T1(ID,DE)
    SELECT 21,'好东西'
    UNION ALL 
    SELECT 22,'新产品'
    UNION ALL
    SELECT 23,'进口'
    UNION ALL
    SELECT 24,'国产'
    UNION ALL
    SELECT 26,'不明'--
    CREATE TABLE T2(ID INT IDENTITY(1,1),MSG VARCHAR(20),ISGOOD INT,USERID INT)
    INSERT INTO T2(MSG,ISGOOD,USERID)
    SELECT '我要',1,22 UNION ALL
    SELECT '不好',0,22 UNION ALL
    SELECT '啥玩意',0,22 UNION ALL
    SELECT 'YESHA',1,21 UNION ALL
    SELECT '不评价',1,23 UNION ALL
    SELECT'谢谢x', 1,22--
    CREATE TABLE T3( ID INT IDENTITY(1,1),USERID INT)
    INSERT INTO T3(USERID)
    SELECT 23 
    UNION ALL 
    SELECT 23 
    UNION ALL
    SELECT 23 
    UNION ALL
    SELECT 21  
    UNION ALL
    SELECT 23
    UNION ALL
    SELECT 21  
    UNION ALL
    SELECT 23
    UNION ALL
    SELECT 24/*希望求出的表如下:注:该商品好评数(b.ISGOOD=1为好评)和被点击次数,如BC两表无记录则不选出
    a.id ,  b.(商品好评数ISGOOD=1), c.(被点击次数)
    21          1                     2
    22          2                     null
    23          1                     5
    24          null                  1
    */
    ---查询
    ;WITH
    DD AS(SELECT DISTINCT T1.ID,T1.DE,T2.ISGOOD,T2.MSG
    FROM T1,T2,T3 
    WHERE T1.ID=T2.USERID 
    ),
    DD1 AS(SELECT DD.ID,ISNULL(SUM(ISGOOD),NULL) HP
    FROM DD  
    GROUP BY DD.ID)SELECT ISNULL(DD1.ID,TB.USERID) ID,DD1.HP,TB.DJ
    FROM DD1 FULL JOIN(SELECT T3.USERID,COUNT(*) DJ FROM T3 GROUP BY T3.USERID) TB
    ON DD1.ID=TB.USERID
    ORDER BY ID/*结果:
    ID          HP          DJ
    ----------- ----------- -----------
    21          1           2
    22          2           NULL
    23          1           5
    24          NULL        1(4 行受影响)
    */
    --删除演示环境
    DROP TABLE T1,T2,T3
      

  6.   

    用maco_wang弄好了,全是牛人。结帐了,谢谢。