0

我正在为各个州使用的应用程序创建一些报告。数据库有可能非常大。我想知道哪种方法是获取列总数的最佳方法。

目前我有类似于以下的 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 多列,并且有时会将其中 4 列或更多列相加。

我正在考虑声明一些@Parameters 并将每个列设置为等于@Parameter,然后我可以添加我需要显示列总数的@Parameters,即:SET @Total = @c1 + @c2

但是,SQL Server 引擎是否会像这样多次关心列在那里?有没有更好的方法来做到这一点?

4

2 回答 2

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
于 2010-10-13T15:58:55.727 回答
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 不同。

于 2010-10-13T15:58:25.353 回答