【问题标题】:Don't understand query behaviour不了解查询行为
【发布时间】:2017-01-23 14:42:45
【问题描述】:

我在报表生成器中有一个奇怪的行为。 在尝试使用报表生成器之前,我正在使用现有数据集并在 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

以下内容返回了我在 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

感谢大家的帮助! :)

【问题讨论】:

    标签: sql reporting-services reportbuilder3.0 sccm


    【解决方案1】:

    第一个查询:

    当您使用像 SUM 这样的聚合函数时,您需要对所有没有聚合函数的列进行 GROUP BY。

    第二次查询:

    这很有效,因为您的选择中没有聚合函数,因此您不必使用 GROUP BY 并且报表生成器可以为您处理总和和分组依据。

    第三次查询:

    此查询有效,因为您在所有列上都有聚合函数,因此您不需要 GROUP BY。

    永远记住LOGICAL查询处理顺序如下:

    1.来自 2.在哪里 3.分组依据 4.拥有 5.选择 6.订购方式

    因此,您的 GROUP BY 发生在 SELECT 之前,因此当您 group by 时,您不能在 group by 子句中包含 '',因为该列尚不存在。 所以它会给你一个错误。

    【讨论】:

      【解决方案2】:

      使用聚合函数(例如 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 函数并让报表处理聚合,并在报表生成器中进行适当的分组。

      【讨论】:

      • 嘿,不知道!顺便说一句,我仍然无法使其工作,谢谢您的信息:(我尝试像您一样按整行或仅返回“无效列名”的别名进行分组。变量在这里不是问题吗?
      • 抱歉,在午休结束时剪切并粘贴。让我们丢失 group by 中的别名/虚拟字段!
      猜你喜欢
      • 2020-12-18
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 2016-02-02
      相关资源
      最近更新 更多