我正在为各个州使用的应用程序创建一些报告。数据库有可能非常大。我想知道哪种方式是获得列总数的最佳方式。
目前我的SQL类似于以下内容:
SELECT count(case when prg.prefix_id = 1 then iss.id end) +
count(case when prg.prefix_id = 2 then iss.id end) as total,
count(case when prg.prefix_id = 1 then iss.id end) as c1,
count(case when prg.prefix_id = 2 then iss.id end) as c2
FROM dbo.TableName
WHERE ...
如您所见,列在那里两次。在一个例子中,即时添加它们并显示总数,在另一个实例中,我只显示报告所需的各个值。
这是SQL的一个非常小的样本,有20多列和w / i这些列中有4列或更多列有时会相加。
我正在考虑声明一些@Parameters并将每个列设置为等于@Parameter,然后我可以添加@serameters我需要显示列总数,IE:SET @Total = @c1 + @c2
但是,SQL Server引擎是否甚至关心这些列在那里多次?有没有更好的方法呢?
答案 0 :(得分:2)
任何原因都没有这样做
select prg.prefix_id, count(1) from tablename where... group by prg.prefix_id
它将为您提供prefix_id的结果集,并且每个prefix_ID的行数...可能优先于一系列count(case)语句,我认为它应该更快,但我可以'确认无疑。
我会在使用@vars之前使用子查询。像这样:
select c1,c2,c1+c1 as total from
(SELECT
count(case when prg.prefix_id = 1 then iss.id end) as c1,
count(case when prg.prefix_id = 2 then iss.id end) as c2
FROM dbo.TableName
WHERE ... ) a
答案 1 :(得分:1)
如果可以在使用T-SQL过程逻辑之前使用直接SQL。经验法则,如果你可以在SQL中做到这一点在SQL中做。如果要使用直接SQL模拟静态值,请尝试使用如下内联视图:
SELECT iv1.c1 + iv1.c2 as total,
iv1.c1,
iv1.c2
FROM
(
SELECT count(case when prg.prefix_id = 1 then iss.id end) as c1,
count(case when prg.prefix_id = 2 then iss.id end) as c2
FROM dbo.TableName
WHERE ...
) AS iv1
通过这种方式,您可以在逻辑上获取计数一次,并可以根据这些计数计算值。但是我认为SQL Server非常聪明,不必扫描计数n次,所以我不知道你的计划会与我发送的SQL和你拥有的SQL有所不同。