2015-09-14 4 views
1

У меня есть запрос sql, где мне нужно получить количество записей, я правильно получаю счет с текущим запросом, но я хочу получить только количество записей, где «Unchecked Count» не равен нулю.SQL QUERY case с условием

SELECT   
    dbo.Customer.AccountNo AS Cust_Acc_No, 
    dbo.Customer.Name AS [Customer Name], 
    dbo.Customer.Adrs1 AS Cust_Address_1,  
    dbo.Customer.Adrs2 AS Cust_Address_2, 
    dbo.Customer.City AS Cust_City, 
    dbo.Customer.Province, 
    dbo.Customer.PostalCode AS Cust_Postal_Code, 
    dbo.Customer.Email1 AS Email, 
    CAST(dbo.Customer.AccStatus AS int) AS [Account Status], 
    dbo.Customer.ID AS CID, 
    case when COUNT(dbo.Manifest.ID) < 
     sum(CASE WHEN (dbo.Manifest.CheckedBy IS NULL OR 
      (LTRIM(RTRIM(dbo.Manifest.CheckedBy)) = '')) THEN 1 ELSE 0 END) 
    then COUNT(dbo.Manifest.ID) else 
     sum(CASE WHEN (dbo.Manifest.CheckedBy IS NULL OR 
     (LTRIM(RTRIM(dbo.Manifest.CheckedBy)) = '')) THEN 1 ELSE 0 END) 
    end as [Unchecked Count], 
    case when COUNT(dbo.Manifest.ID) < 
     sum(CASE WHEN (dbo.Manifest.CheckedBy IS not NULL OR 
      (LTRIM(RTRIM(dbo.Manifest.CheckedBy))! = '')) THEN 1 ELSE 0 END) 
    then COUNT(dbo.Manifest.ID) else 
     sum(CASE WHEN (dbo.Manifest.CheckedBy IS not NULL OR 
      (LTRIM(RTRIM(dbo.Manifest.CheckedBy))! = '')) THEN 1 ELSE 0 END) 
    end as [Checked_Count], 
    COUNT(dbo.Manifest.ID) as Total 

    FROM    
    dbo.Customer inner JOIN dbo.Manifest ON dbo.Customer.AccountNo = dbo.Manifest.FKAccountNo 

    GROUP BY 
    dbo.Customer.AccountNo, 
    dbo.Customer.Name, 
    dbo.Customer.Adrs1, 
    dbo.Customer.City, 
    dbo.Customer.Province, 
    dbo.Customer.Adrs2, 
    dbo.Customer.Email1, 
    dbo.Customer.PostalCode, 
    dbo.Customer.AccStatus, 
    dbo.Customer.ID,Manifest.FKAccountNo 
+2

Просим использовать теги dbms. (Некоторый не ANSI SQL там ...) – jarlh

+0

Спасибо jarlh и a_horse_with_no_name. – Vik

+0

У вас '[Checked_Count]' с подчеркиванием и '[Unchecked Count]' без него. Это ваша цель? – AlexanderW

ответ

1

Вы можете запросить результат другого запроса. SELECT * FROM (<your query>) AS T WHERE [Unchecked Count] > 0

+0

- он работает! Спасибо! – Vik

2

Попробуйте Having пункт после group by пункта

having [Unchecked Count] > 0 

Полный запроса

SELECT  dbo.Customer.AccountNo AS Cust_Acc_No, dbo.Customer.Name AS [Customer Name], dbo.Customer.Adrs1 AS Cust_Address_1, dbo.Customer.Adrs2 AS Cust_Address_2, dbo.Customer.City AS Cust_City, 
        dbo.Customer.Province, dbo.Customer.PostalCode AS Cust_Postal_Code, dbo.Customer.Email1 AS Email, CAST(dbo.Customer.AccStatus AS int) AS [Account Status], dbo.Customer.ID AS CID, 
        case when COUNT(dbo.Manifest.ID) < sum(CASE WHEN (dbo.Manifest.CheckedBy IS NULL OR 
        (LTRIM(RTRIM(dbo.Manifest.CheckedBy)) = '')) THEN 1 ELSE 0 END) 
        then COUNT(dbo.Manifest.ID) else 
        sum(CASE WHEN (dbo.Manifest.CheckedBy IS NULL OR 
        (LTRIM(RTRIM(dbo.Manifest.CheckedBy)) = '')) THEN 1 ELSE 0 END) 
        end 
        as [Unchecked Count], 
         case when COUNT(dbo.Manifest.ID) < sum(CASE WHEN (dbo.Manifest.CheckedBy IS not NULL OR 
        (LTRIM(RTRIM(dbo.Manifest.CheckedBy))! = '')) THEN 1 ELSE 0 END) 
        then COUNT(dbo.Manifest.ID) else 
        sum(CASE WHEN (dbo.Manifest.CheckedBy IS not NULL OR 
        (LTRIM(RTRIM(dbo.Manifest.CheckedBy))! = '')) THEN 1 ELSE 0 END) 
        end 
        as [Checked_Count], 
        COUNT(dbo.Manifest.ID) as Total 

        FROM   dbo.Customer inner JOIN 
        dbo.Manifest ON dbo.Customer.AccountNo = dbo.Manifest.FKAccountNo 
        GROUP BY dbo.Customer.AccountNo, dbo.Customer.Name, dbo.Customer.Adrs1, dbo.Customer.City, dbo.Customer.Province, dbo.Customer.Adrs2, dbo.Customer.Email1, dbo.Customer.PostalCode, dbo.Customer.AccStatus, 
        dbo.Customer.ID,Manifest.FKAccountNo 
    having [Unchecked Count] > 0 
0

Спасибо AlexanderW и Шакти для вашего answers.I пытались оба ваши предложения, но 'Переполнение Count' является псевдоним, поэтому я получил недопустимую ошибку столбца. Но ваши ответы помогли мне решить эту проблему. Вот как это работает сейчас, пожалуйста, дайте мне знать, если у вас есть лучшее предложение/с.

WITH OnlyUnchecked AS(<MyQuery>) 
SELECT * 
FROM OnlyUnchecked 
WHERE [Unchecked Count]>0 
+0

Я мало знаю о синтаксисе SQL-сервера. Может быть, вы можете попробовать UncheckedCount (без места и скобки) – Shakti

+0

Вышеупомянутый запрос в моем ответе работает. Я ссылался на этот вопрос на ошибку http://stackoverflow.com/questions/3264950/invalid-column-name-error-in-where-clause-column-selected-with-case – Vik

+0

Я забыл дать подзапрос псевдоним имя. я изменил свой ответ выше. Хорошо, что вы нашли рабочий вариант. Я бы предпочел подумать над тем, можно ли (и нужно) оптимизировать запрос. Вам не нужно вычислять поле '[Checked_Count]' для строк с '[Unchecked Count] <0'. Таким образом, вы можете вычислить '[Unchecked Count]' в подзапросе и '[Checked_Count]' во внешнем запросе. Суб-запрос должен содержать все исходные поля, необходимые для вычисления '[Checked_Count]', например 'dbo.Manifest.ID' и' dbo.Manifest.CheckedBy'. – AlexanderW