2017-01-23 3 views
0

レポートビルダーで異常な動作があります。 私は、レポートビルダーを試す前に、既存のデータセットから作業して、SQLスタジオで自分のコードをテストしています。そして、以下が動作しない理由を私は理解していないので、私は迷ってしまいました:fn_rbac_Advertisement.Nameはgroup by句を必要とするのでクエリの動作がわからない

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 

このレポートビルダでは私にエラーを促しています。以下は、適切に元のレポートに取り組んでいるのに対し:

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 

感謝を! :)

答えて

1

最初のクエリ:あなたはSUMのような集計関数を使用するときは、集計機能を持っていないすべての列にGROUP BYを行うために

必要です。

2番目のクエリは:あなたはあなたのためにすることにより合計とグループを扱うことができGROUP BY、レポートビルダを使用するように持っていけない、そのため、あなたの選択で集計機能を持っていけないので

これは動作します。

サードクエリ:あなたはGROUP BYに必要いけないので、すべてのあなたの列に集計機能を持っているので、

このクエリが動作します。

は常に論理クエリ処理の順序は以下の通りであることを覚えている:

1.FROM 2.WHERE 3.GROUP 5.SELECT 6.ORDERので、あなたの

BY 4.HAVING BY GROUP BYはその理由のためにSELECTの前に起こります。あなたがグループ化するときには、その列がまだ存在しないため、あなたのgroup by句に ''を含めます。 なのでエラーになります。

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句を使用すると、SELECT文からSUM関数を削除し、レポートビルダで適切なグループ分けを行って、レポートに集計を処理させることができます。

+0

ねえ、それを知らなかった!私はまだそれを動作させることができない方法で情報のThx :(私はあなたのように完全な行でグループ化しようとしたか、または私に "無効な列名"を返すエイリアスのみ。 ? –

+0

私の昼休みの終わりに、それをカットし貼りました。グループのエイリアス/ダミーフィールドを失ってみましょう! –

関連する問題