заставить потолок считать (*) в SQL-запросе - PullRequest
3 голосов
/ 19 сентября 2010

Я использую подзапрос, чтобы вернуть счет в виде целочисленного значения для моего основного запроса.Этот запрос используется для перепривязки 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

Как это можно сделать?

Ответы [ 6 ]

2 голосов
/ 19 сентября 2010

Заменить

COUNT(*)

На

CASE WHEN COUNT(*) > 99 THEN 99 ELSE COUNT(*) END AS YourColumnName
1 голос
/ 19 сентября 2010

Вместо того, чтобы изменить результат 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. Конечно, можно спросить, в чем смысл отображать значение, если оно некорректно для начала, и почему бы не сделать слой пользовательского интерфейса способным отображать «больше 99».

1 голос
/ 19 сентября 2010

Это может быть немного эффективнее. Так как он может остановить сканирование строк после достижения 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
1 голос
/ 19 сентября 2010

Выражение 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 голосов
/ 19 сентября 2010

или двойное UNION в качестве SELECT MEMB_ID, MEMB_Name, SELECT COUNT (*) в качестве WC FROM из SessionOrder WHERE SessionOrder.SORD_MEMB_ID = m.MEMB_ID и SessionOrder.SORD_NumberCompleteDownloads <> 0 и WC = 0 и WC> 99 как MEMB_Downloads, MEMB_JoinDate FROM Member * 1001

0 голосов
/ 19 сентября 2010

СЛУЧАЙ это должно быть ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...