2017-01-23 2 views
0

Ich habe ein seltsames Verhalten im Berichtsgenerator. Ich arbeite mit einem vorhandenen Dataset und teste meinen eigenen Code in SQL Studio, bevor ich den Report Builder ausprobiere. Und ich bin verloren, weil ich verstehe nicht, warum die folgende nicht funktioniert:Abfrageverhalten nicht verstehen

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 

Dieser in Report Builder ist mir ein Fehler aufgefordert, weil fn_rbac_Advertisement.Name eine Gruppe müssen durch Klausel. Während der folgenden ordnungsgemäß funktioniert im ursprünglichen Bericht:

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 

und gibt folgende Formel mich, was ich will in 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 

Vielen Dank für alle Hilfe Jungs! :)

Antwort

1

Erste Frage:

, wenn Sie Aggregatfunktion wie SUM verwenden müssen Sie auf alle Spalten eine GROUP BY tun, die nicht die Aggregatfunktion haben Sie.

Zweite Frage:

das funktioniert, weil Sie eine Aggregatfunktion in Ihrer select nicht dafür verwenden Sie müssen GROUP BY und Berichts-Generator nicht durch für Sie die Summe und die Gruppe behandeln.

Dritte query:

diese Abfrage funktioniert, weil Sie auf alle Ihre Spalten Aggregatfunktion haben, so dass Sie GROUP BY nicht brauchen.

Erinnern Sie immer die logische Abfrageverarbeitung, um wie unten:

1.From 2.Where 3.GROUP VON 4.HAVING 5.SELECT 6.ORDER VON

so Ihre GROUP BY passiert aus diesem Grund vor SELECT, wenn Sie gruppieren, indem Sie '' in Ihre group by-Klausel aufnehmen, weil diese Spalte noch nicht existiert. so gibt es einen Fehler.

1

Bei der Verwendung von Aggregatfunktionen (wie SUM) Sie eine GROUP BY-Klausel auf alle Spalten anwenden müssen, die nicht aggregiert werden zB:

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 

Alternativ, wenn Sie nicht eine lange beibehalten wollen GROUP BY-Klausel Sie könnten die SUM-Funktionen aus der SELECT-Anweisung entfernen und den Bericht die Aggregation mit entsprechender Gruppierung im Report Builder behandeln lassen.

+0

Hey, wusste das nicht! Thx für die Information übrigens kann ich immer noch nicht funktionieren :(Ich habe versucht, mit der vollen Zeile zu gruppieren, wie du es getan hast oder nur den Alias, der mir "ungültigen Spaltennamen" zurückgibt. Können die Variablen hier kein Problem sein ? –

+0

Entschuldigung, schneiden und einfügen, dass am Ende meiner Mittagspause Lassen Sie uns die Aliased/Dummy-Felder in der Gruppe von verlieren! –