WITH cte AS(
SELECT lsh='1234',dm='23-DF',sp='大白兔1' UNION ALL
SELECT '1234','23-DF',NULL UNION ALL
SELECT '1343','24-DF','大白兔2' UNION ALL
SELECT '1234','23-DF','大白兔1' UNION ALL
SELECT '1343','24-DF','白兔1' UNION ALL
SELECT '1234','23-DF','大白兔1'
)
--我想统计一下同一个lsh,dm下有多少种不同的商品,如果商品名称相同则算作是只有一种
SELECT lsh ,
dm ,
COUNT(DISTINCT ( CASE WHEN ISNULL(sp, '') = '' THEN NULL
ELSE sp
END ))
FROM cte
GROUP BY lsh ,
dm
-----------------
--结果
lsh dm
---- ----- -----------
1234 23-DF 1
1343 24-DF 2
-----------------
--但如果数据量很多的话,速度很慢,求其他方法
SELECT lsh='1234',dm='23-DF',sp='大白兔1' UNION ALL
SELECT '1234','23-DF',NULL UNION ALL
SELECT '1343','24-DF','大白兔2' UNION ALL
SELECT '1234','23-DF','大白兔1' UNION ALL
SELECT '1343','24-DF','白兔1' UNION ALL
SELECT '1234','23-DF','大白兔1' )
,ctte as(
select lsh,dm,a=count(1) from cte where sp is not null group by lsh,dm,sp)
select lsh,dm,count(1) from ctte group by lsh,dm
WITH cte AS(
SELECT lsh='1234',dm='23-DF',sp='大白兔1' UNION ALL
SELECT '1234','23-DF',NULL UNION ALL
SELECT '1343','24-DF','大白兔2' UNION ALL
SELECT '1234','23-DF','大白兔1' UNION ALL
SELECT '1343','24-DF','白兔1' UNION ALL
SELECT '1234','23-DF','大白兔1' )
select lsh,dm,count(1) from (select lsh,dm,a=count(1) from cte where sp is not null group by lsh,dm,sp)a
group by lsh,dm
WITH cte AS(
SELECT lsh='1234',dm='23-DF',sp='大白兔1' UNION ALL
SELECT '1234','23-DF',NULL UNION ALL
SELECT '1343','24-DF','大白兔2' UNION ALL
SELECT '1234','23-DF','大白兔1' UNION ALL
SELECT '1343','24-DF','白兔1' UNION ALL
SELECT '1234','23-DF','大白兔1' )
select lsh,dm,count(distinct lsh+dm+sp) from cte group by lsh,dm
这样?
FROM cte
WHERE sp <> ''
GROUP BY lsh , dm你的cte 是个里面是个查询还是就是你写的用union all填充数据
考虑改成临时表,在lsh , dm 列上建一个联合索引就ok了
其实这个没有太大影响你这个关键的从索引着手。
CREATE CLUSTERED INDEX b ON t(lsh,dm)
CREATE NONCLUSTERED INDEX a ON t(lsh,dm,sp)
SELECT lsh ,
dm ,
COUNT(DISTINCT (sp))
FROM t
GROUP BY lsh,dm
我把你的数据放到T表里面
WITH cte AS(
SELECT lsh='1234',dm='23-DF',sp='大白兔1',bz=1 UNION ALL
SELECT '1234','23-DF',NULL,2 UNION ALL
SELECT '1343','24-DF','大白兔2',0 UNION ALL
SELECT '1234','23-DF','大白兔1',-1 UNION ALL
SELECT '1343','24-DF','白兔1',2 UNION ALL
SELECT '1234','23-DF','大白兔1',1
)
--我想统计一下同一个lsh,dm下有多少种不同的商品,如果商品名称相同则算作是只有一种
SELECT lsh ,
dm ,
COUNT(DISTINCT ( CASE WHEN bz<0 THEN NULL
ELSE ISNULL(sp,'')
END ))
FROM cte
GROUP BY lsh ,
dm
SELECT lsh ,
dm ,
COUNT(DISTINCT ( sp ))
FROM cte
WHERE bz >= 0
AND sp IS NOT NULL
GROUP BY lsh ,
dm
distinct 应该是去不掉的,没有你的数据像这种统计信息当以一句话直接得出的话,很难去搞懂sql自身的优化逻辑。
ELSE sp END )) FROM cte GROUP BY lsh , dm