2016-09-15 3 views
0

Ich wurde mit der Entwicklung eines Registrierungsformulars beauftragt, basierend auf der Leistung, die Mitarbeiter für das laufende Jahr haben und nicht haben. Auf jeder Seite des vollständigen Berichts werden Informationen für jeden einzelnen Mitarbeiter angezeigt, wobei oben die typischen Informationen angezeigt werden und dann eine Liste aller verfügbaren Leistungstypen mit einer Spalte daneben, die eine mögliche Dollarzahl anzeigt, die angibt, dass der Mitarbeiter gerade bezahlt diese Art der Berichterstattung. Wenn diese Spalte leer ist, hat dieser Mitarbeiter diese Abdeckung nicht.SSRS-Formular/Bericht und Outer-Join-Ergebnisse

Dies ist, was die Form wie folgt aussieht: enter image description here

ich eine Abfrage geschrieben haben, die linke äußere beschäftigt Joins, die mit einigen dieser Zeilen einschließlich der Mitarbeiter eine Zeile für jede Leistungsart von einem Master-Leistungstabelle zurück Informationen und Zahlungsbetrag für 1 einzelnen Mitarbeiter. Wenn ich die Abfrage modifiziere, um Ergebnisse für mehr als einen Mitarbeiter abzurufen, enthält der Ergebnissatz nur zusätzliche Zeilen für die Leistungen, für die der zusätzliche Mitarbeiter bezahlt. Mein Gedanke ist, dass ich meine Datenmenge ausarbeiten muss, so dass die Gesamtzahl der Zeilen = Anzahl der Mitarbeiter * Anzahl der Vorteile. Vielleicht mache ich das aber falsch.

Gesucht hoch und niedrig, aber ich fühlte das Bedürfnis, eine Gemeinschaft zu erreichen, von der ich so viel gelernt habe. Ja, zum ersten Mal Lurker Post. Hoffentlich wurde meine Situation klar und prägnant beschrieben.

EDIT: Hier ist die SQL, die mir die Ergebnisse, die ich für 1 Person suchen. Wenn ich nach zusätzlichen Mitarbeitern frage, gibt es nur Zeilen für Leistungen zurück, auf die sie zahlen. Die Leistungstabelle hat nur eine Zeile zum Vorteil eines Mitarbeiters. Die Tabelle pr_deduction_master bietet alle Vorteile. Fragen Sie mich nicht nach Code-Bezeichnung ... scheint diese Implementierung in mancher Hinsicht schlecht gemacht worden zu sein.

select emp.a_name_last + ', ' + emp.a_name_first as 'Name', emp.a_employee_number, emp.e_ssn, emp.e_email, 
    emp.ed_p_address1, emp.ed_p_address_city, emp.ed_p_address_state, emp.ed_p_address_zip, 
    a.a_deduction_code, a.a_ded_desc_long, b.a_employee_number, b.dh_emp_amount 
from 
(select distinct a_deduction_code, a_ded_desc_long from pr_deduction_master where a_deduction_code in 
(2000,2005,2007,2008,2010,2015,2020,2025,2027,2030,2040,2045, 
2050,8055,8205,8210,8215,8220,8225,8230,8235,8240,8245,8250, 
8252,8253,8255,8260,8280,8290,8295,8300,8305,8310,8315,8316, 
8700,8701,8702,9100,9150,9151,9200)) a 
left outer join 
(select distinct a_employee_number, a_deduction_code, dh_emp_amount from pr_ded_history where a_employee_number in (603) and dh_pr_warr like '10816A') b 
on a.a_deduction_code = b.a_deduction_code 
left outer join 
(select a_employee_number, a_name_last, a_name_first, ed_p_address1, ed_p_address_city, ed_p_address_state, ed_p_address_zip, e_ssn, e_email 
from pr_employee_master) emp 
on b.a_employee_number = emp.a_employee_number 
order by a_ded_desc_long 

Ich hoffe, dass dies jemand zu viel Gag machen. Anfänger versuchen hier besser zu werden. Ich werde diese Vorschläge prüfen. Wirklich zu schätzen die Antworten.

EDIT 2: Nach Daniel E Ratschlag, "nehmen [Mitarbeiter] CROSS APPLY [Vorteile] vor der linken Beitritt zur Tabelle von [EmployeeBenefits]" das Kreuz anwenden zeigt mir, was benötigt wird wie unten.

Employee Table and Benefits Table

Wenn ich versuche, eine Variante mit der dritten Tabelle beitritt, werden die Abzüge History-Tabelle, wo jeder Mitarbeiter Abzüge für einen Monat aufgenommen, ich unerwünschte Ergebnisse zu erzielen. Ich möchte an dieser dritten Tabelle teilnehmen und NULL in Zeilen anzeigen, in denen die Mitarbeiter diese Art von Leistungsabzug nicht hatten, und dann einen Dollarbetrag für Leistungen, die sie in der vorherigen Periode gezahlt haben.

+0

Veröffentlichen Sie Ihre SQL, so dass wir eine Idee haben, was Ihre Tabellenstruktur ist und was zum Teufel Sie tun ??? – ajeh

+0

"Gesamtzahl der Zeilen = Anzahl der Mitarbeiter * Anzahl der Vorteile." Warum machst du Links Outer Joins? Das könnte dein Problem sein. Ein linker Join sollte Ihnen geben, was Sie brauchen, und Sie sollten nur einen Join benötigen. Mitarbeiter links beitreten Vorteile. Ein linker äußerer Join schlägt vor, dass Sie Zeilen eliminieren, die Sie Ihrer Aussage nicht näher bringen. ... aber ja. Veröffentlichen Sie einige Beispieldaten, stellen Sie Ihre Tabellenstrukturen bereit, wenn Sie Hilfe benötigen. – xenapan

+0

Einige Schemainformationen würden hier wahrscheinlich helfen. Wie sehen Ihre Quellentabellen aus? Einige Beispieldaten wären auch gut. Hat die Leistungstabelle eine Zeile für jede Leistung, für die ein Mitarbeiter bezahlt, oder auch die $ 0s? – SMM

Antwort

1

Um zu erreichen, was ich erreichen wollte, ging ich mit etwas, was Daniel E. sagte.

take [Angestellte] CROSS APPLY [Vorteile] vor links nach Tabelle Verbindung von [EmployeeBenefits] - Daniel E.

Der Unterschied war, dass ich utitilized CROSS JOIN. Als ich mich der Tabelle [EmployeeBenefits] angeschlossen hatte, hatte ich immer noch Schwierigkeiten, weil ich versuchte, einen Filter auf diesen Tisch anzuwenden, der ihn wiederum zu einem INNEREN JOIN machte. Dies wurde wiederum gelöst, indem eine Abfrage für diese Tabelle mit dem Filter verschachtelt wurde.

Nochmals vielen Dank für Ihre Gedanken und Hilfe !!