不理解查询行为
Don't understand query behaviour
我在报表生成器中有一个奇怪的行为。
在尝试使用报表生成器之前,我正在使用现有数据集并在 SQL studio 中测试我自己的代码。我迷路了,因为我不明白为什么以下内容不起作用:
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
需要一个 group by 子句。而以下内容在原始报告中正常工作:
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
以及以下 returns 我在 SQL Studio 中想要的东西:
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
感谢大家的帮助! :)
使用聚合函数(例如 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 子句,您可以从 SELECT 语句中删除 SUM 函数,让报表处理聚合,并在 Report Builder 中进行适当的分组。
第一个查询:
当您使用像 SUM 这样的聚合函数时,您需要对所有没有聚合函数的列执行 GROUP BY。
第二个查询:
这是可行的,因为您的 select 中没有聚合函数,因此您不必使用 GROUP BY,报表生成器可以为您处理总和和分组依据。
第三个查询:
此查询有效,因为您对所有列都有聚合函数,因此您不需要 GROUP BY。
永远记住逻辑查询处理顺序如下:
1.FROM
2.WHERE
3.GROUP 通过
4.HAVING
5.SELECT
6.ORDER通过
因此,您的 GROUP BY 发生在 SELECT 之前,因此当您分组时,您不能在分组依据子句中包含 '',因为该列尚不存在。
所以它给你一个错误。
我在报表生成器中有一个奇怪的行为。 在尝试使用报表生成器之前,我正在使用现有数据集并在 SQL studio 中测试我自己的代码。我迷路了,因为我不明白为什么以下内容不起作用:
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
需要一个 group by 子句。而以下内容在原始报告中正常工作:
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
以及以下 returns 我在 SQL Studio 中想要的东西:
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
感谢大家的帮助! :)
使用聚合函数(例如 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 子句,您可以从 SELECT 语句中删除 SUM 函数,让报表处理聚合,并在 Report Builder 中进行适当的分组。
第一个查询:
当您使用像 SUM 这样的聚合函数时,您需要对所有没有聚合函数的列执行 GROUP BY。
第二个查询:
这是可行的,因为您的 select 中没有聚合函数,因此您不必使用 GROUP BY,报表生成器可以为您处理总和和分组依据。
第三个查询:
此查询有效,因为您对所有列都有聚合函数,因此您不需要 GROUP BY。
永远记住逻辑查询处理顺序如下:
1.FROM 2.WHERE 3.GROUP 通过 4.HAVING 5.SELECT 6.ORDER通过
因此,您的 GROUP BY 发生在 SELECT 之前,因此当您分组时,您不能在分组依据子句中包含 '',因为该列尚不存在。 所以它给你一个错误。