2017-01-23 2 views
0

У меня странное поведение в построителе отчетов. Я работаю из существующего набора данных и тестирую свой собственный код в студии SQL, прежде чем пытаться создать построитель отчетов. И я потерял, потому что я не понимаю, почему следующее не работает:Не понимаю поведение запроса

SELECT 
     v_Collection_Alias.Name as CollectionName, 
     v_Package_Alias.Name as SoftwareName, 
     'Package' as ApplicationType, 
     NumberSuccessTable='NumberSuccessTable', sum(case when stat.LastState in (-1,13) then 1 else 0 end) as NumberSuccess, 
     NumberInProgressTable='NumberInProgress', sum(case when stat.LastState in (8,9) then 1 else 0 end) as NumberInProgress, 
     NumberUnknownTable='NumberUnknown', sum(case when stat.LastState in (0) then 1 else 0 end) as Unknown, 
     NumberErrorTable='NumberError', sum(case when stat.LastState in (11) then 1 else 0 end) as NumberError, 
     NumberOtherTable='NumberOther', sum(case when stat.LastState in (10) then 1 else 0 end) as NumberOther, 
     '' as LastModifiedby, 
     '' as Version, 
     v_Advertisement_Alias.CollectionID as CollectionID, 
     v_Advertisement_Alias.AdvertisementID as DeploymentID, 
     '' as CI_ID, 
     '' as DeploymentTime, 
     v_Advertisement_Alias.PresentTime as ModificationTime, 
     '' as AssignmentID 

FROM fn_rbac_Advertisement(@UserSIDs) v_Advertisement_Alias 
JOIN fn_rbac_ClientAdvertisementStatus(@UserSIDs) stat on v_Advertisement_Alias.AdvertisementID = stat.AdvertisementID 
INNER JOIN fn_rbac_Package2(@UserSIDs) v_Package_Alias ON v_Advertisement_Alias.PackageID = v_Package_Alias.PackageID 
INNER JOIN fn_rbac_Collection(@UserSIDs) v_Collection_Alias ON v_Advertisement_Alias.CollectionID = v_Collection_Alias.CollectionID 

Это в построитель отчетов побуждая мне ошибку, потому что fn_rbac_Advertisement.Name нужна группа по п. Принимая во внимание следующее работает должным образом в первоначальном докладе:

SELECT 
    v_Collection_Alias.Name as CollectionName, 
    v_Package_Alias.Name as SoftwareName, 
    '' as ApplicationType, 
    '' as NumberSuccess, 
    '' as NumberInProgress, 
    '' as NumberUnknown, 
     '' as NumberErrors, 
     '' as NumberOther, 
    '' as LastModifiedby, 
    '' as Version, 
    v_Advertisement_Alias.CollectionID as CollectionID, 
    v_Advertisement_Alias.AdvertisementID as DeploymentID, 
    '' as CI_ID, 
    '' as DeploymentTime, 
    v_Advertisement_Alias.PresentTime as ModificationTime, 
    '' as AssignmentID, 
    '' as ApplicationType 


FROM fn_rbac_Advertisement(@UserSIDs) v_Advertisement_Alias 
INNER JOIN fn_rbac_Package2(@UserSIDs) v_Package_Alias ON v_Advertisement_Alias.PackageID = v_Package_Alias.PackageID 
INNER JOIN fn_rbac_Collection(@UserSIDs) v_Collection_Alias ON v_Advertisement_Alias.CollectionID = v_Collection_Alias.CollectionID 

и следующие возвращает мне то, что я хочу в SQL студии:

Select 
NumberSuccessTable='NumberSuccessTable', sum(case when stat.LastState in (-1,13) then 1 else 0 end), 
NumberInProgressTable='NumberInProgress', sum(case when stat.LastState in (8,9) then 1 else 0 end), 
NumberUnknownTable='NumberUnknown', sum(case when stat.LastState in (0) then 1 else 0 end) AS NumberU, 
NumberErrorTable='NumberError', sum(case when stat.LastState in (11) then 1 else 0 end) AS NumberError, 
NumberOtherTable='NumberOther', sum(case when stat.LastState in (10) then 1 else 0 end) as NumberOther 
From v_ClientAdvertisementStatus stat 

Спасибо за любую помощь, ребята! :)

ответ

1

Первый запрос:

при использовании агрегатной функции SUM, как вам нужно сделать GROUP BY на всех столбцах, которые не имеют агрегатную функцию.

Второй запрос:

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

Третий запрос:

этот запрос работает, потому что у вас есть агрегатная функция на все столбцы, так что вам не нужно, чтобы GROUP BY.

Всегда помните ЛОГИЧЕСКИЕ порядок обработки запросов, как показано ниже:

1.From 2.Where 3.GROUP BY 4.Having 5.SELECT 6.ORDER BY

так что ваши GROUP BY происходит до SELECT по этой причине, когда вы группируете себя, вы не можете включать '' в свою группу, потому что этот столбец еще не существует. , так что это дает вам ошибку.

1

При использовании агрегатных функций (например, SUM), вы должны применять предложения GROUP BY для всех столбцов, которые не агрегированных, например:

GROUP BY v_Collection_Alias.Name, 
    v_Package_Alias.Name, 
    v_Advertisement_Alias.CollectionID as CollectionID, 
    v_Advertisement_Alias.AdvertisementID as DeploymentID, 
    v_Advertisement_Alias.PresentTime as ModificationTime 

В качестве альтернативы, если вы не хотите, чтобы поддерживать длительный GROUP BY вы можете удалить функции SUM из инструкции SELECT и позволить отчету обрабатывать агрегацию с соответствующей группировкой в ​​построителе отчетов.

+0

Эй, не знал этого! Thx для информации, кстати, я все еще не могу заставить ее работать :(Я попытался сгруппировать по всей строке, как и вы, или только псевдоним, который возвращает мне «недопустимое имя столбца». Могут ли переменные быть проблемой здесь ? –

+0

Извините, вырезать и наклеить это в конце обеденного перерыва. Давайте проиграем псевдонимы/фиктивные поля в группе! –

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