2016-06-13 8 views
1

Ich versuche, durch SSRS und nicht die Abfrage eindeutige Datensatz zu bekommen und dann Daten basierend auf verschiedenen Werten zu summieren. Ich führe einen gespeicherten proc innerhalb des SSRS Datensatzes aus, um Daten zu erhalten. Im Folgenden ist das Ergebnis der proc:Wie bekomme ich einen eindeutigen Wert und gruppiere mich danach?

Company ProductID PayeeID PayeeName GroupID Profit 
ABC  123  1  Brenda  1a  $30 
ABC  123  1  Brenda  1a  $30 
ABC  123  1  Brenda  1b  $30 
ABC  456  2  Diana  2a  $45 
ABC  456  2  Diana  2a  $45 
ABC  789  3  Jonathan 3a  $23 
ABC  789  3  Jonathan 3a  $23 
ABC  789  3  Jonathan 3b  $23 
ABC  789  3  Jonathan 3b  $23 

Was ich tun muss, ist Gruppe und Summe Gewinn für einzigartige Unternehmen, Produkten, Zahlungsempfänger und NICHT groupID. Wie Sie sehen können, gibt es doppelte Gruppen-IDs. Ich möchte das deutlich machen. Ich habe Setup alle Gruppierungen in SSRS aber nicht wissen, wie es für GroupID verschieden zu machen, damit mein Ergebnis wird, wie unten in SSRS zeigt sich:

Company ProductID PayeeID PayeeName Profit 
ABC  123  1  Brenda $90  =(1a+1a+1b) 
ABC  456  2  Diana  $90 
ABC  789  3  Jonathan $92 

** sollte nicht SUM Wert von doppelten GroupID

Was ich will:

Company ProductID PayeeID PayeeName Profit 
ABC  123  1  Brenda $60  =(1a+1b) 
ABC  456  2  Diana  $45 
ABC  789  3  Jonathan $46 

** nICHT doppelte Werte Summieren

Jede Idee, wie man dies in SSRS zu tun und nicht auf Abfrageebene? Grund, warum ich nicht auf Abfrageebene möchte, ist, weil ich eine Tabelle erstellen, proc ausführen und ihre Daten in der Tabelle speichern müsste, die ich erstellte. Wenn in Zukunft die gespeicherte Proc-Struktur geändert wird, müsste ich an beiden Stellen ändern, damit der Bericht funktioniert. Jede Hilfe wäre willkommen, danke!

Antwort

2

können Sie versuchen, die folgenden:

SELECT Company, ProductID, PayeeID, PayeeName, SUM(Profit) as Profit 
FROM (SELECT DISTINCT * FROM Table_1) as t 
GROUP BY Company, ProductID, PayeeID, PayeeName; 
0

1) Wenn es akzeptabel ist, würde ich Werte dieser neuen Spalte innerhalb derselben gespeicherte Prozedur daher mit:

SELECT a.*, 
    SUM(CASE WHEN RowNum = 1 THEN Profit END) 
    OVER(PARTITION BY a.Company/*or CompanyID ?*/, ProductID, PayeeID) AS SumOfProfit 
FROM (
    SELECT ..., -- Plus one more column 
     ROW_NUMBER() OVER(PARTITION BY a.Company/*or CompanyID ?*/, ProductID, PayeeID, GroupID ORDER BY @@SPID) AS RowNum 
    FROM ... final query from stored procedure ... 
    .... 
) a 

Im Grunde ist dies will hinzufügen eine neue Spalte (SumOfProfit) zum Originaldatensatz (!)

Company ProductID PayeeID PayeeName GroupID Profit SumOfProfit 
ABC  123  1  Brenda  1a  $30 60 
ABC  123  1  Brenda  1a  $30 60 
ABC  123  1  Brenda  1b  $30 60 
ABC  456  2  Diana  2a  $45 ... 
ABC  456  2  Diana  2a  $45 
ABC  789  3  Jonathan 3a  $23 
ABC  789  3  Jonathan 3a  $23 
ABC  789  3  Jonathan 3b  $23 
ABC  789  3  Jonathan 3b  $23 

2) Die zweite Lösung ist t o-Transformation (wenn möglich) gespeicherten Prozedur in benutzerdefinierte Funktion

  • Mehrstufige UDF-Funktion (wenn es zwei oder mehr Linien) oder
  • Inline UDF-Funktion (wenn es nur eine Zeile hat; Hinweis: manchmal möglich ist, mehrzeilige gespeicherte Prozedur in ein verwandeln {inline | einzelnen Zeilen} somit Funktion)

und die ich ändern würde, um die gespeicherte Prozedur:

ALTER PROCEDURE ... 
AS 
BEGIN 
    SELECT f.... 
    FROM dbo.UserDefinedFunction(...) f 
    -- ORDER BY ... ? 
END 

und für diesen Bericht würde ich verwenden (als Datenquelle) folgende Abfrage/Stored Procedure:

SELECT s.Company, s.ProductID, s.PayeeID, SUM(Profit) AS SumOfProfit 
FROM (
    SELECT DISTINCT f.Company, f.ProductID, f.PayeeID, f.GroupID, f.Profit 
    FROM dbo.UserDefinedFunction(...) f 
) s 
GROUP BY s.Company, s.ProductID, s.PayeeID 

3) natürlich, wenn Lösung 1 und 2 nicht anwendbar ist und if initial stored procedure don't include insert into another table, für den zweiten Bericht können wir somit ersten gespeicherte Prozedur wiederverwenden (I diese Methode nicht mag):

CREATE TABLE #Results (
    Company ..., 
    ProductID INT, 
    PayeeID INT, 
    ... 
) 
INSERT #Results (...) 
EXEC dbo.FirstStoredProcedure (...) 
-- and then 
SELECT s.Company, s.ProductID, s.PayeeID, SUM(Profit) AS SumOfProfit 
FROM (
    SELECT DISTINCT f.Company, f.ProductID, f.PayeeID, f.GroupID, f.Profit 
    FROM #Results f 
) s 
GROUP BY s.Company, s.ProductID, s.PayeeID 
+0

Hinweis: Mir ist bewusst, dass dies keine SSRS-Lösung ist. –

0

Ich bin hier mit einer reinen SSRS Lösung, aber es ist sehr hässlich und unnötig komplex.Diese Lösung wurde zum Spaß gemacht, so dass ich nicht empfehle, diesen Ansatz gegen einen großen Datensatz zu verwenden, und ich würde dringend eine T-SQL-Lösung empfehlen.

Basierend auf den Datensatz, den Sie geschrieben ich folgende tablix erstellt:

enter image description here

Ich habe die letzte Spalte (Details Spalte) mit Spaltensichtbarkeit Fenster versteckt.

enter image description here

Verwenden von benutzerdefinierten Code können Sie die Funktionalität von SSRS-Funktionen erweitern, indem VB-Code. Gehen Sie zu Report menu/Report properties... Wechseln Sie zur Registerkarte Code und geben Sie den folgenden Code in den Textbereich ein.

Public Function MySum(ByVal groups as Object(), ByVal values as Object()) As Integer 
Dim found_groups As System.Collections.ArrayList=New System.Collections.ArrayList() 
Dim n as Integer 
Dim sum as Integer = 0 
For n = 0 To groups.Length-1 
    If not found_groups.Contains(groups(n)) Then 
     found_groups.Add(groups(n)) 
     sum = sum + values(n) 
    End If 
Next 
Return sum 
End Function 

in der ausgewählten Zelle (die tablix Bildschirm überprüfen) I diesen Ausdruck verwendet haben:

=Code.MySum(Lookupset(
Fields!ProductID.Value &"-"& 
Fields!PayeeID.Value &"-", 
Fields!ProductID.Value &"-"& 
Fields!PayeeID.Value &"-", 
CStr(Fields!GroupID.Value), 
"DataSet1" 
), 
Lookupset(
Fields!ProductID.Value &"-"& 
Fields!PayeeID.Value &"-", 
Fields!ProductID.Value &"-"& 
Fields!PayeeID.Value &"-", 
CStr(Fields!Profit.Value), 
"DataSet1" 
)) 

Notiere die MySum() -Funktion zwei Arrays als Argumente und eine ganze Zahl zurück, die Summe aus die Profit Werte in der angegebenen Gruppe.

Es Vorschauen etwas wie folgt aus:

enter image description here

Achtung: diese Lösung gebaut wurde auf der Grundlage der in Ihre Frage zur Verfügung gestellt Datensatz, wenn die Datenstruktur ändert es nicht funktionieren wird.

Lassen Sie mich wissen, ob dies hilft.