22,210
社区成员
发帖
与我相关
我的任务
分享
;WITH CTET1
AS
(
SELECT *,RN=ROW_NUMBER()OVER(ORDER BY Count1 DESC),Type='a' FROM (SELECT vtype,COUNT(*) AS Count1 FROM TempUserusejl GROUP BY vtype ) AS t --606行
),CTET2
AS
(
SELECT *,RN=ROW_NUMBER()OVER(ORDER BY Count1 DESC),Type='b' FROM (SELECT uAddr,COUNT(*) AS Count1 FROM TempUserusejl GROUP BY uAddr ) AS t
),CTET3 --33行
AS (
SELECT * ,RN=ROW_NUMBER()OVER(ORDER BY Count1 DESC),Type='c' FROM (SELECT user_IP,COUNT(*) AS Count1 FROM TempUserusejl GROUP BY user_IP) AS t )
,CTET4 AS ( --9492行
SELECT *,RN=ROW_NUMBER()OVER(ORDER BY Count1 DESC),Type='d' FROM (SELECT videoId,COUNT(*) AS Count1 FROM TempUserusejl GROUP BY videoId ) AS t
) --11672行
,CTET
AS
(
SELECT * FROM CTET1
UNION ALL
SELECT * FROM CTET2
UNION ALL
SELECT * FROM CTET3
UNION ALL
SELECT * FROM CTET4
)
SELECT max(CASE WHEN Type='a' THEN vtype ELSE '' END) AS a,max(CASE WHEN Type='a' THEN Count1 ELSE 0 END) AS aNum,
max(CASE WHEN Type='b' THEN vtype ELSE '' END) AS b,max(CASE WHEN Type='b' THEN Count1 ELSE 0 END) AS bNum,
max(CASE WHEN Type='c' THEN vtype ELSE '' END) AS c,max(CASE WHEN Type='c' THEN Count1 ELSE 0 END) AS cNum,
max(CASE WHEN Type='d' THEN vtype ELSE '' END) AS d,max(CASE WHEN Type='d' THEN Count1 ELSE 0 END) AS dNum
FROM CTET
GROUP BY RN
-- 给你写个例子,效率你自己测试一下
create table test(id int identity, addr varchar(10), sex varchar(10), age int)
go
insert into test(addr, sex, age) values
('北京', '男', 20),('河北', '男', 20),('河南', '男', 50),('山东', '男', 21),
('北京', '女', 30),('辽宁', '女', 20),('河南', '男', 33),('山东', '男', 20),
('北京', '女', 35),('河北', '男', 25),('山西', '女', 33),('山东', '男', 33),
('北京', '男', 35),('河北', '男', 24),('河南', '男', 20),('山东', '女', 20)
go
with m1 as (
select row_number() over(order by count(*) desc) rn1,addr, count(*) c1
from test group by addr
),
m2 as (
select row_number() over(order by count(*) desc) rn2,sex, count(*) c2
from test group by sex
),
m3 as(
select row_number() over(order by count(*) desc) rn3,age, count(*) c3
from test group by age
)
select coalesce(m1.rn1, m2.rn2, m3.rn3) rn,
m1.addr, m1.c1, m2.sex, m2.c2, m3.age, m3.c3
from m1
full join m2 on m1.rn1 = m2.rn2
full join m3 on coalesce(m1.rn1, m2.rn2) = m3.rn3
go
drop table test
go
(16 行受影响)
rn addr c1 sex c2 age c3
-------------------- ---------- ----------- ---------- ----------- ----------- -----------
1 北京 4 男 11 20 6
2 山东 4 女 5 33 3
3 河北 3 NULL NULL 35 2
4 河南 3 NULL NULL 50 1
5 辽宁 1 NULL NULL 21 1
6 山西 1 NULL NULL 24 1
7 NULL NULL NULL NULL 25 1
8 NULL NULL NULL NULL 30 1
(8 行受影响)
SELECT a,COUNT(*) AS Count1,'a' AS type FROM TempUserusejl GROUP BY a
UNION ALL
SELECT b,COUNT(*) AS Count1,'b' AS type FROM TempUserusejl GROUP BY b
UNION ALL
SELECT c,COUNT(*) AS Count1,'c' AS type FROM TempUserusejl GROUP BY c
UNION ALL
SELECT d,COUNT(*) AS Count1,'d' AS type FROM TempUserusejl GROUP BY d
SELECT COUNT(DISTINCT a) AS aCount,COUNT(DISTINCT b) AS bCount,COUNT(DISTINCT c) AS cCount,COUNT(DISTINCT d) AS dCount FROM TempUserusejl