我使用子查询将计数作为整数值返回到我的主查询。此查询用于重新绑定ASP.NET DataGrid,我只有两个可用于此列的字符宽度。我想将宽度限制为两个字符。所以,当计数超过99时,我想将值设置为99.我无法想办法做到这一点?我在这里看不到如何应用案例陈述。
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 :(得分:2)
替换
COUNT(*)
用
CASE WHEN COUNT(*) > 99 THEN 99 ELSE COUNT(*) END AS YourColumnName
答案 1 :(得分: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
答案 2 :(得分: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
答案 3 :(得分:1)
而不是更改COUNT(*)结果,最好计算最多99:
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”。
答案 4 :(得分:0)
CASE应该是......
答案 5 :(得分:0)
或将UNION加倍 选择 MEMB_ID, MEMB_Name, SELECT COUNT(*)AS WC 来自SessionOrder WHERE SessionOrder.SORD_MEMB_ID = m.MEMB_ID 和SessionOrder.SORD_NumberCompleteDownloads&lt;&gt; 0 并且WC =&lt; 99 作为MEMB_Downloads, MEMB_JoinDate 来自会员 联盟 选择 MEMB_ID, MEMB_Name, 99 AS WC 来自SessionOrder WHERE SessionOrder.SORD_MEMB_ID = m.MEMB_ID 和SessionOrder.SORD_NumberCompleteDownloads&lt;&gt; 0 和WC&gt; 99 作为MEMB_Downloads, MEMB_JoinDate 来自会员