2016-08-08 62 views
0

eingeführt wird. Ich verwende CTE, um mehrere Felder zu erstellen und dann Verhältnisse zwischen diesen Feldern zu berechnen. Ich benutze auch den linken Join-Tisch-Kalender, um alle Monate in meinen SSRS-Bericht zu bringen, obwohl es für die nächsten Monate keine Daten gibt. Mein Problem ist, dass die Felder "Binds NewBusiness", "Binds Renewal", "Binds Rewrite" von einem anderen Tisch stammen müssen und auch nach Monaten aufgeteilt werden müssen. Wie kann ich diese Felder mitbringen, damit ich sie in einer abschließenden Select-Anweisung meines CTE verwenden kann und sie auch um Monate zerlegen kann? Wie kann ich diese Abfrage umschreiben?Wie kann ich diese Abfrage umschreiben? In der Auswahlliste kann nur ein Ausdruck angegeben werden, wenn die Unterabfrage nicht mit EXISTS

;WITH cte_Debra 
    AS 
    (
     SELECT  underwriter, 
        --ControlNo, 
        (
        SELECT 
          SUM(CASE WHEN PolicyType = 'New Business' THEN Premium ELSE 0 END) as 'Binds NewBusiness', 
          SUM(CASE WHEN PolicyType = 'Renewal' THEN Premium ELSE 0 END) as 'Binds Renewal', 
          SUM(CASE WHEN PolicyType = 'Rewrite' THEN Premium ELSE 0 END) as 'Binds Rewrite' 
        FROM ProductionReportMetrics 
        WHERE YEAR(EffectiveDate)= 2016 AND CompanyLine = 'Ironshore Insurance Company' 
        ) as Binds, 

        COUNT(CASE WHEN Type = 'New Business' THEN ControlNo END) as  'Submitted - New Business', 
        COUNT(CASE WHEN Type = 'Renewal' THEN ControlNo END)  as  'Submitted - Renewals', 
        COUNT(CASE WHEN Type = 'Rewrite' THEN ControlNo END)  as  'Submitted - Rewrite', 
        COUNT(CASE WHEN Type = 'New Business' THEN ControlNo END)+COUNT(CASE WHEN Type = 'Renewal' THEN ControlNo END)+COUNT(CASE WHEN Type = 'Rewrite' THEN ControlNo END) as 'Submitted - ALL',  


        COUNT(CASE WHEN Type = 'New Business' AND QuotedPremium IS NOT NULL THEN ControlNo END)   as 'Quoted - New Business', 
        COUNT(CASE WHEN Type = 'Renewal'  AND QuotedPremium IS NOT NULL THEN ControlNo END)   as 'Quoted - Renewals', 
        COUNT(CASE WHEN Type = 'Rewrite'  AND QuotedPremium IS NOT NULL THEN ControlNo END)   as 'Quoted - Rewrite', 
        COUNT(CASE WHEN Type = 'New Business' AND QuotedPremium IS NOT NULL THEN ControlNo END)+COUNT(CASE WHEN Type = 'Renewal'  AND QuotedPremium IS NOT NULL THEN ControlNo END)+COUNT(CASE WHEN Type = 'Rewrite'  AND QuotedPremium IS NOT NULL THEN ControlNo END) as 'Quoted - ALL', 

        b.MonthNum, 
        b.YearNum, 
        b.MonthName 

     FROM  tblCalendar b 
     LEFT JOIN Test_Plaza_ClearanceReport a ON b.MonthNum=Month(a.EffectiveDate)  
        AND b.YearNum = YEAR(a.EffectiveDate) 
        AND a.Underwriter ='Brown, Debra' 
     WHERE  b.YearNum = 2016 
     GROUP BY 
         b.MonthName, 
         b.MonthNum, 
         b.YearNum, 
         --ControlNo, 
         underwriter 
    ) 

    select   Underwriter, 
        MonthNum, 
        YearNum, 
        MonthName, 
      [Binds - NEW BUSINESS],[Binds - RENEWALS],[Binds - REWRITE], -- Binds without Total 

      [Submitted - New Business], [Submitted - Renewals], [Submitted - Rewrite],       --submitted 
      [Submitted - ALL],                     -- submitted ALL 

      [Quoted - New Business], [Quoted - Renewals], [Quoted - Rewrite],         -- Quoted 
      [Quoted - ALL],                      -- quoted ALL 

      [Bound - NewBusiness],[Bound - Renewals],[Bound - Rewrite],           --Bound 
      [Bound - ALL],                      -- Bound ALL 

      [Declined - NewBusiness],[Declined - Renewal],[Declined - Rewrite],         --Declined 
      [Declined - ALL],                     --Declined ALL 
     --and so on 

    FROM cte_Debra 

Das gewünschte Ergebnis würde so aussehen: enter image description here

und diese drei Felder in rot eingekreist haben aus einer anderen Tabelle kommen. Gemeinsame Spalten sind Kontrollnummer und PolicyNumber

+0

Oleg Sie fragen, wie eine weitere Tabelle hinzufügen, dass wir keine Kenntnis haben von seiner Struktur/Felder etc. und das ist eine Menge zu durchschauen.Ich würde vorschlagen, beweisen, Schema-Beispieldaten und gewünschte Ergebnis sowie dumbing die Tsql einige, so dass Sie nur mit 1 Beispiel für jedes Ihrer Probleme beschäftigen (zB brauchst du nicht nur 10 errechnete Rationen zu zeigen 1) – Matt

Antwort

1

Sie haben noch viele Details, aber um Ihnen eine Idee zu geben, müssen Sie Ihren anderen Tisch setzen (lassen Sie sagen Bindet) mit den Summen, die man bis zum Jahr gruppiert brauchen und Monat. Ihre Daten benötigen ein Datumsfeld, das dem Monat/Jahr in Ihrer aktuellen Abfrage entspricht.

Etwas wie:

SELECT ... 
FROM DATE_TABLE D 
LEFT JOIN cte_Debra AS C ON D.MONTH = C.MonthNum AND B.YEAR = C.YearNum 
LEFT JOIN (
    SELECT MONTH(DATE_FIELD) AS B_MO, YEAR(DATE_FIELD) AS B_YEAR, SUM(NEW_BUSINESS) AS NEW_BUSINESS, SUM(RENEWALS) AS RENEWALS, SUM(REWRITE) AS REWRITE 
    FROM BINDS 
    GROUP ON MONTH(DATE_FIELD), YEAR(DATE_FIELD) 
    ) AS B ON B.B_MO = C.MonthNum AND B.B_YEAR = C.YearNum 

Da Sie alle Termine wollen, würde ich mit Ihrem Datum Tabelle beginnen - oder Sie können es direkt danach JOIN.

Sie auch als auch auf Ihrem Underwiter JOIN möchten (Sie das Feld in der SELECT des Bindet umfassen müssten Tabelle und ON-Anweisungen.

+0

Danke und wann würde ich meine Kalender Tabelle (LEFT JOIN) verwenden, um alle Monate mitzunehmen, auch wenn es keine Daten gibt? – Oleg

+0

Du solltest nicht JOIN LINKS ** bis ** die Datumstabelle - sonst stimmen nur die Daten mit den Daten überein Ich habe mein answe aktualisiert r eine DATE-Tabelle als Starttabelle hinzufügen. –

+0

'; mit cte_debra AS ( SELECT FROM ClearanceReport WHERE GROUP BY ) SELECT Underwriter, MonthNum aus dem Kalender c LEFT cte_Debra d JOIN auf c.MonthNum = d.MonthNum LEFT JOIN ( SELECT MonthNum, sum (... vON ProductionReport GROUP BY MonthNum ) als P auf b.MonthNum = p.MonthNum WHERE GRoup von ... ' – Oleg