2013-10-07 2 views
7

Добрый день всем здесь мой кодграф Возвращаясь пустым вместо 0

SELECT 
    'Expired Item -'+ DateName(mm,DATEADD(MM,4,AE.fld_LOAN)) as [Month] 
    ,COUNT(PIT.fld_ID)'COUNT' 
    ,SUM (PIT.fld_GRAM)'GRAMS' 
    ,SUM (PH.fld_AMNT)'PRINCIPAL' 
FROM #AllExpired AE 
    INNER JOIN Transactions.tbl_ITEM PIT 
    ON AE.fld_MAINID=PIT.fld_MAINID 
    INNER JOIN Transactions.tbl_HISTO PH 
    ON AE.fld_MAINID =PH.fld_MAINID 
GROUP BY DATENAME(MM,(DATEADD(MM,4,AE.fld_LOAN))) 

проблема я столкнулся в том, что мой граф функция не возвращает значение 0, если оно не имеет значения, Сумма функция не возвращает NULL, если результирующие значения не получены, вместо этого он просто выводит пустой, почему это так? и как я могу это исправить?

вот снимок экрана вывода образца

A

конечно это не я хочу, я хочу его вывести ноль и нулям. пожалуйста, помогите мне, я не знаю, что случилось. Спасибо.

+2

Какое значение вы ожидаете появиться в столбце «месяц» - SQL Server просто должен магически составлять значение? –

+1

Но когда есть строки * no * для обработки - условие, при котором нужный результат равен 0 - из чего он собирается его вычислить? –

+0

ohhh я вижу сейчас, я понимаю :) спасибо @Damien_The_Unbeliever, вы помогли мне снова на этот раз :) – user2705620

ответ

10

Вы не можете ожидать каких-либо записей, которые будут выводиться при использовании Предложение GROUP BY, если в вашем источнике нет записей.

Если вы хотите получить 0 из функций SUM и COUNT, вам не следует использовать GROUP BY.

Причина в том, что, когда у вас нет записей, предложение GROUP BY не имеет ничего, чтобы сгруппировать, а затем не может дать вам никакого вывода.

Например:

SELECT COUNT(*) FROM (SELECT 'Dummy' AS [Dummy] WHERE 1 = 0) DummyTable 

будет возвращать одну запись со значением '0', где, как:

SELECT COUNT(*) FROM (SELECT 'Dummy' AS [Dummy] WHERE 1 = 0) DummyTable 
GROUP BY [Dummy] 

не будет возвращать никаких записей.

+0

причина, почему я использовал группу, из-за этой ошибки 'Msg 8120, уровень 16, состояние 1, строка 2 Колонка«# AllExpired.fld_LoanDate»недопустим в списке выбора, поскольку он не содержится либо в агрегатной функции, либо в предложении GROUP BY. любое предложение? Как удалить ошибку с помощью группы? – user2705620

+0

Ну, вы не можете удалить предложение GROUP BY, если вам нужен список общего количества, грамм и принципала для каждого месяца с датой кредитования. Уродливое обходное решение, если вы хотите, чтобы ваш исходный запрос возвращал строку с 0, когда нет записей, нужно добавить что-то вроде этого к вашему запросу: 'UNION SELECT NULL AS [месяц], 0 AS [COUNT], 0 AS [GRAMS], 0 AS [PRINCIPAL] WHERE (SELECT COUNT (*) FROM #AllExpired) = 0', но лучшим решением было бы заставить ваше приложение обрабатывать исходный запрос, не возвращая никакие строки. – Dan

+0

Есть и другие способы решения этой проблемы, вы также можете использовать 'COALESCE' с каждым полем, чтобы вернуть 0, когда результат равен« NULL ». Или используйте коррелированный подзапрос, чтобы гарантировать, что данные «верхнего уровня» всегда возвращаются, любые любые агрегированные функции затем возвращают 0. – Tony

1

Возможно, #AllExpired is empty, или У одного из объединений ничего не найдено.

Помните, что внутренние соединения нуждаются в результатах с обеих сторон для возврата, так как #AllExpired пуст, соединение ничего не возвращает.

Измените его на соединение OUTER.

+0

да, это пусто, хорошо? разве он не должен выводить ноль? когда я использую функцию count>? – user2705620

2

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

SELECT 
    'Expired Item -'+ DateName(mm,DATEADD(MM,4,AE.fld_LoanDate)) as [Month] 
    ,COUNT(PIT.fld_PawnItemID)'COUNT' 
    ,SUM (PIT.fld_KaratGram)'GRAMS' 
    ,SUM (PH.fld_PrincipalAmt)'PRINCIPAL' 
FROM #AllExpired AE 
    LEFT JOIN Transactions.tbl_PawnItem PIT 
     ON AE.fld_PawnMainID=PIT.fld_PawnMainID 
    LEFT JOIN Transactions.tbl_PawnHisto PH 
     ON AE.fld_PawnMainID=PH.fld_PawnMainID 
GROUP BY DATENAME(MM,(DATEADD(MM,4,AE.fld_LoanDate))) 
+0

по-прежнему пустой. :(. – user2705620

Смежные вопросы