现有三表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
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
*/
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
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
*/
-----演示环境
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