Member 12965461 Ответов: 2

Sql запрос не дает желаемого результата


Select UsrMain.Name,UsrMain.DefaultSalesOrg,csslogicalunit.userlu ,
case when count(CssRplOutboundPackageInfo.Id)='' then 0 else count(CssRplOutboundPackageInfo.Id)  end as 
"Initial Package Count" 
from CssRplOutboundPackageInfo 
 left join UsrMain 
On UsrMain.Pkey=CssRplOutboundPackageInfo.UsrMainPKey       
left join csslogicalunit
on csslogicalunit.pkey = usrmain.csslogicalunitpkey
where CssRplOutboundPackageInfo.WorkState='Initial' 
and UsrMain.id= 'T89387'
group by UsrMain.Name,UsrMain.DefaultSalesOrg,csslogicalunit.userlu


Приведенный выше запрос не дает желаемого результата.

Я хочу напечатать начальное количество пакетов как ноль, когда оно равно нулю.Я получаю этот результат, но когда я пытаюсь напечатать столбцы, такие как UsrMain.Name,UsrMain.DefaultSalesOrg,csslogicalunit.userlu,начальное количество пакетов не приближается к нулю, т. е. он не будет отображать никакого результата.

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

Что я уже пробовал:

Я попытался использовать команду declare.Но я не получаю результата..
Пожалуйста, ответьте на него как можно скорее.

Naga Sindhura

Таблица UsrMain находится в левом соединении. Однако вы использовали UsrMain.id= 'T89387' находится в предложении where, что означает, что код внутренне рассматривает это как внутреннее соединение/ соединение, и одна из причин-CssRplOutboundPackageInfo.WorkState='Initial' не имеет никаких записей, если это так, то вам нужно переписать код, пометив CssRplOutboundPackageInfo в левом соединении.

2 Ответов

Рейтинг:
2

Member 7870345

Привет:
Вместо использования:

case when count(CssRplOutboundPackageInfo.Id)='' then 0 else count(CssRplOutboundPackageInfo.Id) end as
"Initial Package Count" 

попробуйте использовать
COALESCE(COUNT(CssRplOutboundPackageInfo.Id),0) as "Initial Package Count"

В том случае, если функция COUNT() возвращает NULL, COALESCE возвращает 0 (второй аргумент)


Member 12965461

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

Member 7870345

Привет:
Извините, но тогда, возможно, я не понимаю вопроса.
Если вы введете запрос (только что написанный) как "новый запрос" в "Sql Server Management Studio"? Что вы получаете за "начальное количество пакетов"
а) 0
б) ноль
в) пустой столбец?

Member 12965461

Я получаю пустую колонку.
Я хочу напечатать начальное количество пакетов как 0, когда количество равно 0, а также столбцы
например, имя,Defaultsalesorg,userlu.

Member 7870345

Не могли бы вы прислать мне схему таблиц, которые появляются в запросе (то есть CssRplOutboundPackageInfo, UsrMain и csslogicalunit)?

Member 7870345

Извините, я забыл еще кое-что, что мне нужно вам помочь.
Не могли бы вы прислать мне результат (в виде текста) запроса при выполнении в среде Sql Server Management Studio?
(пожалуйста, оставьте заголовки в тексте)
Спасибо.

Рейтинг:
2

CHill60

Используйте свой UsrMain таблица в качестве основного драйвера и левого внешнего соединения с CssRplOutboundPackageInfo - таким образом, вы всегда получите возвращенную строку (при условии, что пользователь T89387 существует). Тогда единственная проблема заключается в том, чтобы иметь дело с количеством исходных пакетов, возвращаемых как NULL - вы можете использовать COALESCE для этого, как и в решении 1 - в данном случае я предпочитаю ISNULL (В данном случае это немного быстрее)
Например (обратите внимание, непроверенный, так как мы не знаем вашей схемы)

select U.Name,U.DefaultSalesOrg,LU.userlu ,

count(ISNULL(CPI.Id,0)) as [Initial Package Count]

from UsrMain U
left OUTER join csslogicalunit LU on LU.pkey = U.csslogicalunitpkey
left OUTER join CssRplOutboundPackageInfo CPI On U.Pkey=CPI.UsrMainPKey AND CPI.WorkState='Initial' 
WHERE U.id= 'T89387'
group by U.Name,U.DefaultSalesOrg,LU.userlu