2010-09-19 61 views
3

我正在使用子查询将计数作为整数值返回到我的主查询。此查询用于重新绑定ASP.NET DataGrid,并且此列只有两个可用的字符宽度。我想限制宽度为两个字符。所以,当计数超过99时,我想设置99的值。我无法想出办法做到这一点?我看不出如何在这里应用案例陈述。在sql查询中强制使用上限来计数(*)

SELECT 
    MEMB_ID, 
    MEMB_Name, 
    SELECT COUNT(*) 
FROM SessionOrder 
WHERE SessionOrder.SORD_MEMB_ID = m.MEMB_ID 
    And SessionOrder.SORD_NumberCompleteDownloads <> 0 
    As MEMB_Downloads, 
    MEMB_JoinDate 
FROM Member 

这怎么办?

+0

您确定您当前的查询有效吗? – 2010-09-19 14:49:18

+0

我忽略了一些细节,但足以显示我正在尝试的内容。 – Jim 2010-09-19 14:57:15

回答

1

CASE表达式可以是这样的:

CASE WHEN COUNT(*) > 99 THEN 99 ELSE COUNT(*) END 

似乎有一对夫妇与您现有的查询错误(例如m未定义)。随着纠正这些错误和变更进行结果查询看起来是这样的:

SELECT 
    MEMB_ID, 
    MEMB_Name, 
    (
     SELECT CASE WHEN COUNT(*) > 99 THEN 99 ELSE COUNT(*) END 
     FROM SessionOrder 
     WHERE SessionOrder.SORD_MEMB_ID = MEMB_ID 
     AND SessionOrder.SORD_NumberCompleteDownloads <> 0 
    ) AS MEMB_Downloads, 
    MEMB_JoinDate 
FROM Member 
+0

好吧,所以我将不得不实际执行子查询两次才能做到这一点?我希望避免这种情况,但也许我别无选择? – Jim 2010-09-19 14:55:52

+0

@Jim:你为什么需要执行两次子查询? – 2010-09-19 14:59:40

+0

我会放弃它!看起来像赢家!非常感谢! – Jim 2010-09-19 15:02:06

2

更换

COUNT(*) 

随着

CASE WHEN COUNT(*) > 99 THEN 99 ELSE COUNT(*) END AS YourColumnName 
0

情况下,它应该是...

0

或双UNION作为 选择 MEMB_ID, MEMB_Name, SELECT COUNT (*)AS WC FROM SessionOrder WHERE SessionOrder.SORD_MEMB_ID = m.MEMB_ID 而SessionOrder.SORD_NumberCompleteDownloads <> 0 和WC = 作为MEMB_Dow nloads, MEMB_JoinDate 从会员 UNION SELECT MEMB_ID, MEMB_Name, 99 AS WC FROM SessionOrder WHERE SessionOrder.SORD_MEMB_ID = m.MEMB_ID 而SessionOrder.SORD_NumberCompleteDownloads <> 0 和WC> 99 作为MEMB_Downloads, MEMB_JoinDate FROM Member

1

这可能会更有效一些。因为它可以在到达第99个时停止扫描行。

SELECT MEMB_ID , 
     MEMB_Name, 
     (SELECT COUNT(*) 
     FROM ( 
       SELECT TOP 99 * 
       FROM SessionOrder 
       WHERE SessionOrder.SORD_MEMB_ID = MEMB_ID 
       AND  SessionOrder.SORD_NumberCompleteDownloads <> 0 
       ) 
       Top99 
     ) AS MEMB_Downloads, 
     MEMB_JoinDate 
FROM Member 
+0

马丁,谢谢你的极限。是的,这应该会更好。 – Jim 2010-10-02 23:45:56

+0

“SELECT TOP 99 *”:只选择ID或其他东西,不要浪费处理器。 (如果你幸运的话,系统会为你猜出。) – ANeves 2010-12-02 20:17:17

1

而不是在99改变COUNT(*)的结果,更好的计数:

SELECT 
    MEMB_ID, 
    MEMB_Name, 
    (SELECT COUNT(*) 
     FROM (
     SELECT TOP(99) * 
     FROM SessionOrder 
     WHERE SessionOrder.SORD_MEMB_ID = m.MEMB_ID 
     And SessionOrder.SORD_NumberCompleteDownloads <> 0) 
     as TOP99_Downloads) 
    As MEMB_Downloads, 
    MEMB_JoinDate 
FROM Member; 

这样你可以避免计算所有下载的时候,你会只显示99无妨。当然,有人会问,如果开始时显示值不正确,为什么不让UI层能显示'超过99'。

+0

谢谢,这个限制是有道理的。我有一个数据网格中的几个计数器,可用空间非常有限。我的客户希望在单个页面上获得太多信息。不是我怎么会想要它!谢谢 – Jim 2010-10-02 23:45:19

+0

@收件人:实际上'*'是最好的选择。使用'*',上面的COUNT运算符可以自由计算*任何*列,并且查询优化器将选择可以使用最窄可能索引进行计数的列。 – 2010-12-02 21:28:26

+0

其实我以前的评论是错误的,谢谢@Remus Rusanu。 [先前的评论被删除。] *是最好的选择,并且如果有空值(未计数),则计算特定列而不是*可能会产生意想不到的结果。 – ANeves 2010-12-09 15:52:59