2016-03-17 2 views
0

Я пытался думать о лучшем названии этого. У меня очень сложный запрос (с использованием традиционного ASP и SQL-сервера), и я собираюсь сделать его более простым, например, для целей.SQL Statement - Использование Count() & Sum() - и сортировка

Это для report.asp

SQL = "select EMPL.employeeName, " & _ 
     "COUNT(BUSINESS.ID) AS theTotal, " & _ 
     "COUNT(CASE WHEN BUSINESS.ID IS NULL THEN 1 END) as unTouched " & _ 
     "FROM EMPL Inner Join BUSINESS " & _ 
     "WHERE EMPL.STATUS = 1 " & _ 
     "GROUP BY EMPL.employeeName " & _ 
     "ORDER BY " & theOrder 

вниз в HTML части У меня есть таблица, которая выглядит примерно так:

<table> 
    <tr> 
     <th><a href="report.asp?sort=1">Employee</th> 
     <th><a href="report.asp?sort=2">Total</th> 
     <th><a href="report.asp?sort=3">Untouched</th> 
    </tr> 
    <tr> 
     <td><%=RS("employeeName")%></td> 
     <td><%=RS("theTotal")%></td> 
     <td><%=RS("unTouched")%></td> 
    </tr> 
</table> 

Наконец, в верхней части страницы, у меня есть выбор case для порядка заказа, который выглядит следующим образом:

theOrder = request.querystring("sort") 

SELECT CASE theOrder 
    CASE 1 
     theOrder = "EMPL.employeeName" 
    CASE 2 
     theOrder = "theTotal, EMPL.employeeName" 
    CASE 3 
     theOrder = "unTouched, EMPL.employeeName" 
    CASE ELSE 
     theOrder = "EMPL.employeeName" 
END SELECT 

Все работает нормально, как предполагалось. Теперь я хочу добавить столбец в конце, который будет отображаться (theTotal - unTouched).

Так что я добавить это вниз в коде цикла до строки таблицы:

do while not RS.eof 

    TheDIfference = RS("theTotal") - RS("unTouched") 

... 

добавить свой заголовок таблицы для «Difference» и новой строки, которая отображает вычитание и все выходит прекрасно.

В этом проблема. Я хочу иметь возможность сортировать по этой колонке так же, как и другие 2 столбца. Так что я попытался добавить строку в моей отборного заявления, что сказал:

SUM(theTotal - unTouched) AS theDifference 

Это не сработало так, то я прописана все это:

SUM(COUNT(BUSINESS.ID)- COUNT(CASE WHEN BUSINESS.ID IS NULL THEN 1 END)) AS theDifference 

то не работало либо.

Итак, есть ли правильный способ включить это в оператор select, чтобы я мог делать orderby или работу вокруг, где мне не нужно вставлять ее внутри самого утверждения?

Любая помощь приветствуется, спасибо!

EDIT: весь реальный запрос:

SQL = "SELECT E.[theTotal], E.[unTouched], (E.[theTotal] - E.[unTouched]) [theDifference] " & _ 
      "FROM (" & _ 
      "SELECT EMPL.EMPLDesc, EMPL.EMPLID, EMPL.EMPLSalesmanID, COUNT(BLXF.BLXFBSNSID) AS theTotal, " & _ 
      "COUNT(CASE WHEN RIGHT(PROJ.ProjCode,1) = 'p' THEN 1 END) AS totalChamber, " & _ 
      "COUNT(CASE WHEN RIGHT(PROJ.ProjCode,1) = 'c' THEN 1 END) AS totalCity, " & _ 
      "COUNT(CASE WHEN LIST.LISTDESC LIKE '%-MUL%' THEN 1 END) AS MulCnt, " & _ 
      "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'p' AND LIST.LISTDESC LIKE '%-MUL%') THEN 1 END) AS MulCntChamber, " & _ 
      "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'c' AND LIST.LISTDESC LIKE '%-MUL%') THEN 1 END) AS MulCntCity, " & _ 
      "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'p' AND LIST.LISTDESC LIKE '%-MUL%' AND BLXF.BLXFLastUpdate IS NULL) THEN 1 END) AS MulCntChamberUN, " & _ 
      "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'c' AND LIST.LISTDESC LIKE '%-MUL%' AND BLXF.BLXFLastUpdate IS NULL) THEN 1 END) AS MulCntCityUN, " & _ 
      "COUNT(CASE WHEN LIST.LISTDESC NOT LIKE '%-MUL%' AND LIST.LISTDESC NOT LIKE '%-RR-%' THEN 1 END) AS NonMulCnt, " & _ 
      "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'p' AND LIST.LISTDESC NOT LIKE '%-MUL%' AND LIST.LISTDESC NOT LIKE '%-RR-%') THEN 1 END) AS NonMulCntChamber, " & _ 
      "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'c' AND LIST.LISTDESC NOT LIKE '%-MUL%' AND LIST.LISTDESC NOT LIKE '%-RR-%') THEN 1 END) AS NonMulCntCity, " & _ 
      "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'p' AND LIST.LISTDESC NOT LIKE '%-MUL%' AND LIST.LISTDESC NOT LIKE '%-RR-%' AND BLXF.BLXFLastUpdate IS NULL) THEN 1 END) AS NonMulCntChamberUN, " & _ 
      "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'c' AND LIST.LISTDESC NOT LIKE '%-MUL%' AND LIST.LISTDESC NOT LIKE '%-RR-%' AND BLXF.BLXFLastUpdate IS NULL) THEN 1 END) AS NonMulCntCityUN, " & _ 
      "COUNT(CASE WHEN BLXF.BLXFLastUpdate IS NULL THEN 1 END) as unTouched, " & _ 
      "COUNT(CASE WHEN (BLXF.BLXFLastUpdate IS NULL AND RIGHT(PROJ.ProjCode,1) = 'p') THEN 1 END) as unTouchedChamber, " & _ 
      "COUNT(CASE WHEN (BLXF.BLXFLastUpdate IS NULL AND RIGHT(PROJ.ProjCode,1) = 'c') THEN 1 END) as unTouchedCity, " & _ 
      "COUNT(CASE WHEN (BLXF.BLXFLastUpdate IS NULL AND LIST.LISTDESC LIKE '%-MUL%') THEN 1 END) as unTouchedMul, " & _ 
      "COUNT(CASE WHEN (BLXF.BLXFLastUpdate IS NULL AND LIST.LISTDESC NOT LIKE '%-MUL%') THEN 1 END) as unTouchedNonMul, " & _ 
      "COUNT(CASE WHEN LIST.LISTDESC LIKE '%-RR-%' THEN 1 END) as reRunCnt, " & _ 
      "COUNT(CASE WHEN (LIST.LISTDESC LIKE '%-RR-%' AND BLXF.BLXFLastUpdate IS NULL) THEN 1 END) as reRunCntUN, " & _ 
      "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'p' AND LIST.LISTDESC LIKE '%-RR-%') THEN 1 END) AS reRunCntChamber, " & _ 
      "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'c' AND LIST.LISTDESC LIKE '%-RR-%') THEN 1 END) AS reRunCntCity, " & _ 
      "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'p' AND LIST.LISTDESC LIKE '%-RR-%' AND BLXF.BLXFLastUpdate IS NULL) THEN 1 END) AS reRunCntChamberUN, " & _ 
      "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'c' AND LIST.LISTDESC LIKE '%-RR-%' AND BLXF.BLXFLastUpdate IS NULL) THEN 1 END) AS reRunCntCityUN " & _ 
      "FROM BLXF INNER JOIN LIST ON BLXF.BLXFLISTID = LIST.LISTID " & _ 
      "INNER JOIN BSST ON BLXF.BLXFBSSTID = BSST.BSSTID " & _ 
      "INNER JOIN EMPL ON LIST.LISTEMPLID = EMPL.EMPLID " & _ 
      "INNER JOIN PROJ ON LIST.LISTPROJID = PROJ.PROJID " & _ 
      "WHERE (LIST.LISTAvailable = 1) AND (BSST.BSSTTerminalInd = 0) AND (PROJ.PROJPJSTID = 2) AND (EMPL.EMPLStatus = 'y') " & _ 
      "GROUP BY EMPL.EMPLDesc, EMPL.EMPLID, EMPL.EMPLSalesmanID " & _ 
      ") E " & _ 
      "ORDER BY " & theOrderBy 

ОБНОВЛЕНО QUERY 2:

SQL = "SELECT E.[theTotal], E.[unTouched], (E.[theTotal] - E.[unTouched]) [theDifference] " & _ 
     "FROM (" & _ 
     "SELECT E.EMPLDesc, E.EMPLID, E.EMPLSalesmanID, COUNT(B.BLXFBSNSID) AS theTotal, " & _ 
     "COUNT(CASE WHEN RIGHT(PROJ.ProjCode,1) = 'p' THEN 1 END) AS totalChamber, " & _ 
     "COUNT(CASE WHEN RIGHT(PROJ.ProjCode,1) = 'c' THEN 1 END) AS totalCity, " & _ 
     "COUNT(CASE WHEN LIST.LISTDESC LIKE '%-MUL%' THEN 1 END) AS MulCnt, " & _ 
     "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'p' AND LIST.LISTDESC LIKE '%-MUL%') THEN 1 END) AS MulCntChamber, " & _ 
     "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'c' AND LIST.LISTDESC LIKE '%-MUL%') THEN 1 END) AS MulCntCity, " & _ 
     "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'p' AND LIST.LISTDESC LIKE '%-MUL%' AND B.BLXFLastUpdate IS NULL) THEN 1 END) AS MulCntChamberUN, " & _ 
     "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'c' AND LIST.LISTDESC LIKE '%-MUL%' AND B.BLXFLastUpdate IS NULL) THEN 1 END) AS MulCntCityUN, " & _ 
     "COUNT(CASE WHEN LIST.LISTDESC NOT LIKE '%-MUL%' AND LIST.LISTDESC NOT LIKE '%-RR-%' THEN 1 END) AS NonMulCnt, " & _ 
     "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'p' AND LIST.LISTDESC NOT LIKE '%-MUL%' AND LIST.LISTDESC NOT LIKE '%-RR-%') THEN 1 END) AS NonMulCntChamber, " & _ 
     "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'c' AND LIST.LISTDESC NOT LIKE '%-MUL%' AND LIST.LISTDESC NOT LIKE '%-RR-%') THEN 1 END) AS NonMulCntCity, " & _ 
     "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'p' AND LIST.LISTDESC NOT LIKE '%-MUL%' AND LIST.LISTDESC NOT LIKE '%-RR-%' AND B.BLXFLastUpdate IS NULL) THEN 1 END) AS NonMulCntChamberUN, " & _ 
     "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'c' AND LIST.LISTDESC NOT LIKE '%-MUL%' AND LIST.LISTDESC NOT LIKE '%-RR-%' AND B.BLXFLastUpdate IS NULL) THEN 1 END) AS NonMulCntCityUN, " & _ 
     "COUNT(CASE WHEN B.BLXFLastUpdate IS NULL THEN 1 END) as unTouched, " & _ 
     "COUNT(CASE WHEN (B.BLXFLastUpdate IS NULL AND RIGHT(PROJ.ProjCode,1) = 'p') THEN 1 END) as unTouchedChamber, " & _ 
     "COUNT(CASE WHEN (B.BLXFLastUpdate IS NULL AND RIGHT(PROJ.ProjCode,1) = 'c') THEN 1 END) as unTouchedCity, " & _ 
     "COUNT(CASE WHEN (B.BLXFLastUpdate IS NULL AND LIST.LISTDESC LIKE '%-MUL%') THEN 1 END) as unTouchedMul, " & _ 
     "COUNT(CASE WHEN (B.BLXFLastUpdate IS NULL AND LIST.LISTDESC NOT LIKE '%-MUL%') THEN 1 END) as unTouchedNonMul, " & _ 
     "COUNT(CASE WHEN LIST.LISTDESC LIKE '%-RR-%' THEN 1 END) as reRunCnt, " & _ 
     "COUNT(CASE WHEN (LIST.LISTDESC LIKE '%-RR-%' AND B.BLXFLastUpdate IS NULL) THEN 1 END) as reRunCntUN, " & _ 
     "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'p' AND LIST.LISTDESC LIKE '%-RR-%') THEN 1 END) AS reRunCntChamber, " & _ 
     "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'c' AND LIST.LISTDESC LIKE '%-RR-%') THEN 1 END) AS reRunCntCity, " & _ 
     "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'p' AND LIST.LISTDESC LIKE '%-RR-%' AND B.BLXFLastUpdate IS NULL) THEN 1 END) AS reRunCntChamberUN, " & _ 
     "COUNT(CASE WHEN (RIGHT(PROJ.ProjCode,1) = 'c' AND LIST.LISTDESC LIKE '%-RR-%' AND B.BLXFLastUpdate IS NULL) THEN 1 END) AS reRunCntCityUN " & _ 
     "FROM BLXF B INNER JOIN LIST ON B.BLXFLISTID = LIST.LISTID " & _ 
     "INNER JOIN BSST ON B.BLXFBSSTID = BSST.BSSTID " & _ 
     "INNER JOIN EMPL E ON LIST.LISTEMPLID = E.EMPLID " & _ 
     "INNER JOIN PROJ ON LIST.LISTPROJID = PROJ.PROJID " & _ 
     "WHERE (LIST.LISTAvailable = 1) AND (BSST.BSSTTerminalInd = 0) AND (PROJ.PROJPJSTID = 2) AND (E.EMPLStatus = 'y') " & _ 
     "GROUP BY E.EMPLDesc, E.EMPLID, E.EMPLSalesmanID " & _ 
     ") E " & _ 
     "ORDER BY " & theOrderBy 
+0

Вы считаете, что вы сортируете свою клиентскую сторону на столе, есть множество плагинов jQuery, которые могут это сделать, вот пример: http://tablesorter.com/docs/ – John

+0

Не пробовал, но все же пытался сохранить его на стороне сервера но если я не могу заставить его работать, я могу посмотреть на клиентскую сторону сортировки – Loopy

ответ

0

Поскольку эти два поля вычисляются столбцы, прежде чем вы можете получить доступ к ним по псевдониму вам нужно будет обернуть их в суб-запрос.

SELECT E.[employeeName], E.[theTotal], E.[unTouched] 
, (E.[theTotal] - E.[unTouched]) [theDifference] 
FROM (
    SELECT E.employeeName, 
    COUNT(B.ID) [theTotal], 
    COUNT(CASE WHEN B.ID IS NULL THEN 1 END) [unTouched] 
    FROM EMPL E 
    INNER JOIN BUSINESS B ON E.SomeField = B.SomeField 
    WHERE E.STATUS = 1 
    GROUP BY E.employeeName 
) E 
ORDER BY E.[employeeName]; 

В INNER JOIN потребности присоединиться в некоторых областях, которые формируют отношения между EMPL столом и BUSINESS таблицы.

+0

Спасибо за ответ! Я получаю сообщение об ошибке: идентификатор из нескольких частей «EMPL.employeeName» не может быть связан – Loopy

+0

@Loopy Я просто скопировал ваш запрос и завернул его, но понимаю, что «INNER JOIN» не прав, должен быть «INNER JOIN BUSINESS ON EMPL.SomeField = BUSINESS.SomeField'. – Lankymart

+0

Я все еще получаю ту же ошибку. Я отредактировал свой первоначальный пост, чтобы поставить весь запрос, потому что, возможно, в моем коротком примере я не вижу ключевого компонента. Дайте мне знать, если вы увидите что-нибудь, спасибо! – Loopy