日期:2014-05-17  浏览次数:20458 次

问个SQL的问题,百分百效率结贴,求大神围观
说明:
希望统计 A-Z 只要出现在行中的分别的数量是多少
此表的列T1-T4 记录着A-Z,位置都是随机的,但肯定都分布在T1-T4列中,可能也没有,那就是NULL,求分别统计A-Z分别出现了多少次就行,求大神围观,给点建设性意见,效率结贴。

以下是脚本:

CREATE TABLE TestCount
(
TCID INT IDENTITY PRIMARY KEY,
TNAME VARCHAR(20),
TC1 VARCHAR(20),
TC2 VARCHAR(20),
TC3 VARCHAR(20),
TC4 VARCHAR(20)
)

INSERT INTO TestCount
SELECT '香蕉','A','B','C','D'
UNION ALL
SELECT '苹果','A',NULL,NULL,NULL
UNION ALL
SELECT '大鸭梨',NULL,'B','C','D'
UNION ALL
SELECT '葡萄','A','A','B','D'
UNION ALL
SELECT '桔子','Z','X','A','D'
UNION ALL
SELECT '橙子','H','J','E','F'


TCID TNAME TC1 TC2 TC3 TC4
1 香蕉 A B C D
2 苹果 A NULL NULL NULL
3 大鸭梨 NULL B C D
4 葡萄 A A B D
5 桔子 Z X A D
6 橙子 H J E F

------解决方案--------------------
SELECT T,COUNT(1) AS CNT
FROM (
SELECT T1 AS T FROM TestCount WHERE T1 IS NOT NULL
UNION ALL 
SELECT T2 AS T FROM TestCount WHERE T2 IS NOT NULL
UNION ALL 
SELECT T3 AS T FROM TestCount WHERE T3 IS NOT NULL
UNION ALL 
SELECT T4 AS T FROM TestCount WHERE T4 IS NOT NULL
) AS T
GROUP BY T


------解决方案--------------------
select t=substring(t,number,1),ct=count(1) from (select (select isnull(tc1,'')+isnull(tc2,'')+isnull(tc3,'')+isnull(tc4,'') from testcount for xml path('')) as t)tb,master..spt_values where type='p' and number between 1 and len(t) group by substring(t,number,1)