我想知道如何写这个查询。
我知道这个实际的语法是虚假的,但它将帮助您理解我想要的东西。
我需要这种格式,因为它是一个更大查询的一部分。
SELECT distributor_id,
COUNT(*) AS TOTAL,
COUNT(*) WHERE level = 'exec',
COUNT(*) WHERE level = 'personal'
我需要在一个查询中返回这一切。
此外,它需要在一行中,所以下面的将不起作用:
'SELECT distributor_id, COUNT(*)
GROUP BY distributor_id'
以其他的回答为基础。
这两种方法都会产生正确的值:
select distributor_id,
count(*) total,
sum(case when level = 'exec' then 1 else 0 end) ExecCount,
sum(case when level = 'personal' then 1 else 0 end) PersonalCount
from yourtable
group by distributor_id
SELECT a.distributor_id,
(SELECT COUNT(*) FROM myTable WHERE level='personal' and distributor_id = a.distributor_id) as PersonalCount,
(SELECT COUNT(*) FROM myTable WHERE level='exec' and distributor_id = a.distributor_id) as ExecCount,
(SELECT COUNT(*) FROM myTable WHERE distributor_id = a.distributor_id) as TotalCount
FROM myTable a ;
然而,性能有很大的不同,随着数据量的增长,这显然会更相关。
我发现,假设表上没有定义索引,使用sum的查询将执行单个表扫描,而使用count的查询将执行多个表扫描。
以执行以下脚本为例:
IF OBJECT_ID (N't1', N'U') IS NOT NULL
drop table t1
create table t1 (f1 int)
insert into t1 values (1)
insert into t1 values (1)
insert into t1 values (2)
insert into t1 values (2)
insert into t1 values (2)
insert into t1 values (3)
insert into t1 values (3)
insert into t1 values (3)
insert into t1 values (3)
insert into t1 values (4)
insert into t1 values (4)
insert into t1 values (4)
insert into t1 values (4)
insert into t1 values (4)
SELECT SUM(CASE WHEN f1 = 1 THEN 1 else 0 end),
SUM(CASE WHEN f1 = 2 THEN 1 else 0 end),
SUM(CASE WHEN f1 = 3 THEN 1 else 0 end),
SUM(CASE WHEN f1 = 4 THEN 1 else 0 end)
from t1
SELECT
(select COUNT(*) from t1 where f1 = 1),
(select COUNT(*) from t1 where f1 = 2),
(select COUNT(*) from t1 where f1 = 3),
(select COUNT(*) from t1 where f1 = 4)
突出显示2条SELECT语句,并单击Display Estimated Execution Plan图标。您将看到第一个语句将执行一个表扫描,第二个语句将执行4个表扫描。显然,一个表扫描比4个表扫描要好。
添加聚集索引也很有趣。如。
Create clustered index t1f1 on t1(f1);
Update Statistics t1;
上面的第一个SELECT将执行单个群集索引扫描。第二个SELECT将执行4个Clustered Index seek,但它们仍然比单个Clustered Index Scan更昂贵。我在一个有800万行的表上尝试了同样的事情,第二个SELECT仍然要昂贵得多。
我做了一些类似的事情,我只是给每个表一个字符串名称来在列a中标识它,并为列提供一个计数。然后我将它们合并,使它们堆叠。结果在我看来是漂亮的-不确定它与其他选项相比有多有效,但它给了我我需要的。
select 'table1', count (*) from table1
union select 'table2', count (*) from table2
union select 'table3', count (*) from table3
union select 'table4', count (*) from table4
union select 'table5', count (*) from table5
union select 'table6', count (*) from table6
union select 'table7', count (*) from table7;
结果:
-------------------
| String | Count |
-------------------
| table1 | 123 |
| table2 | 234 |
| table3 | 345 |
| table4 | 456 |
| table5 | 567 |
-------------------