2016-08-09 23 views
0

Ich habe meine Abfrage alsGruppe nach Monat und Jahr einer Datumsspalte

folgende
SELECT 
    MAX(Reimbursement_EBSUtilization.Id) AS Id, 
    ProviderReimbursementRequest.Contractor_Id, 
    Reimbursement_EBSUtilization.ServiceMonth, 
    fContractor.ContractorName, 
    Reimbursement_EBSUtilization.SD_Id, 
    MAX(StandardUnits) AS StandardUnits, 
    MAX(Rate) AS Rate, 
    SUM(Reimbursement_EBSUtilization.UnitsDelivered) AS UnitsDelivered, 
    NULL AS ReduceUnits, 
    CAST(1 AS bit) AS IsEbs, 
    Reimbursement_EBSUtilization.BHFormName, 
    fExpenseType.ExpenseType, 
    CASE 
     WHEN Reimbursement_EBSUtilization.BHFormName IS NULL THEN MAX(Rate) * SUM(Reimbursement_EBSUtilization.UnitsDelivered) * ISNULL(MAX(Reimbursement_EBSUtilization.StandardUnits), 0) 
     ELSE (CASE 
       WHEN fExpenseType.ExpenseType = 'Payable' THEN SUM(ISNULL(Reimbursement_BHForms.ReimburseAmount, 0)) - SUM(ISNULL(Reimbursement_BHForms.ReducedAmount, 0)) 
       ELSE 0 
      END) - 
      (CASE 
       WHEN fExpenseType.ExpenseType = 'Offset' THEN SUM(ISNULL(Reimbursement_BHForms.ReimburseAmount, 0)) - SUM(ISNULL(Reimbursement_BHForms.ReducedAmount, 0)) 
       ELSE 0 
      END) 
    END AS ReimbursementAmount 
FROM 
    ProviderReimbursementRequest 
LEFT JOIN 
    Reimbursement_EBSUtilization ON ProviderReimbursementRequest.Id = Reimbursement_EBSUtilization.PRR_Id 
LEFT JOIN 
    Reimbursement_BHForms ON Reimbursement_EBSUtilization.Id = Reimbursement_BHForms.REU_Id 
LEFT JOIN 
    fExpenseCategory ON Reimbursement_BHForms.EC_Id = fExpenseCategory.ID 
LEFT JOIN 
    fExpenseType ON fExpenseCategory.ExpenseType = fExpenseType.Id 
LEFT JOIN 
    fContractor ON ProviderReimbursementRequest.Contractor_Id = fContractor.Id 
WHERE 
    MRR_Id = @MrrId 
    AND Reimbursement_EBSUtilization.SD_Id = @ServiceDetailId 
GROUP BY 
    ProviderReimbursementRequest.Contractor_Id, 
    Reimbursement_EBSUtilization.ServiceMonth, 
    fContractor.ContractorName, 
    Reimbursement_EBSUtilization.SD_Id, 
    Reimbursement_EBSUtilization.BHFormName, 
    fExpenseType.ExpenseType 

Auf das Ergebnis der Ausführung wird

Id Contractor_Id ServiceMonth ContractorName SD_Id StandardUnits Rate UnitsDelivered ReduceUnits IsEbs BHFormName ExpenseType ReimbursementAmount 
3976 845 2016-05-01 Payments SC1 2867 1.00 10.00 20 NULL 1 NULL NULL 200.00 
3966 845 2016-07-31 Payments SC1 2867 1.00 10.00 NULL NULL 1 NULL NULL NULL 
3974 846 2016-07-01 Payments SC2 2867 1.00 10.00 100 NULL 1 NULL NULL 1000.00 
3970 846 2016-07-31 Payments SC2 2867 1.00 10.00 20 NULL 1 NULL NULL 200.00 
3978 847 2016-07-31 Payments SC3 2867 1.00 10.00 30 NULL 1 NULL NULL 300.00 
3983 847 2016-08-01 Payments SC3 2867 1.00 10.00 NULL NULL 1 NULL NULL NULL 

Wenn Sie den Dienst Monat Spalte für contractor_id = 846 beobachten wir 2 sehen Datensätze mit demselben Monat. Ich möchte die Ausgabe diese Spalten zu kombinieren wie man ist mit 2016-07-01 und andere ist mit 2016-07-31, da sie beide zum gleichen Monat und Jahr gehören. Ich möchte, dass sie kombiniert werden.

Kann jemand dabei helfen?

+0

Die letzte Spalte sollte 1000 + 200 = 1200 haben? – Whencesoever

+0

das gleiche mit UnitsDelivered? – Whencesoever

+0

Sie gruppieren mein ServiceMonth, aber Sie haben unterschiedliche Werte in der Ausgabe. Sie haben 7/1 und 7/31 für Auftragnehmer 846. Dies scheint, als ob die Spalte möglicherweise nicht gut benannt ist, da es scheint, ein Dienstdatum, kein Monat zu sein. Sie möchten nach dem ersten Tag des Monats gruppieren (und ausgeben). –

Antwort

0

Sie sollten sich wirklich angewöhnen, Aliase zu verwenden und Ihre Abfragen zu formatieren. Wie geschrieben, ist diese Abfrage unmöglich zu entschlüsseln. Mit nur ein paar Aliasen und etwas Formatierung ist es viel sauberer.

select Max(ru.Id) as Id 
    , prr.Contractor_Id 
    , ru.ServiceMonth 
    , c.ContractorName 
    , ru.SD_Id 
    , Max(StandardUnits) as StandardUnits 
    , max(Rate) as Rate 
    , sum(ru.UnitsDelivered) as UnitsDelivered 
    , null as ReduceUnits 
    , Cast(1 as BIT) as IsEbs 
    , ru.BHFormName 
    , et.ExpenseType 
    , case when ru.BHFormName is null 
     then max(Rate) * sum(ru.UnitsDelivered) * ISNULL(max(ru.StandardUnits),0) 
     else 
     (
      case when et.ExpenseType = 'Payable' 
       then sum(ISNULL(f.ReimburseAmount,0)) - sum(ISNULL(f.ReducedAmount,0)) 
       else 0 
      end 
     ) - 
     (
      case when et.ExpenseType = 'Offset' 
       then sum(ISNULL(f.ReimburseAmount,0)) - sum(ISNULL(f.ReducedAmount,0)) 
       else 0 
      end 
     ) end as ReimbursementAmount 
from ProviderReimbursementRequest prr 
left join Reimbursement_EBSUtilization ru on prr.Id = ru.PRR_Id 
left join Reimbursement_BHForms f on ru.Id = f.REU_Id 
left join fExpenseCategory ec on f.EC_Id = ec.ID 
left join fExpenseType et on ec.ExpenseType = et.Id 
left join fContractor c on prr.Contractor_Id = c.Id 
where MRR_Id = @MrrId 
    and ru.SD_Id = @ServiceDetailId 
group by prr.Contractor_Id 
    , ru.ServiceMonth 
    , c.ContractorName 
    , ru.SD_Id 
    , ru.BHFormName 
    , et.ExpenseType 

Um tatsächlich mit Ihrem Problem zu helfen Ich denke, wir brauchen ein bisschen mehr Details. Dies ist ein großartiger Ort, um anzufangen. http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/

--EDIT--

Wenn ich das Problem, das Sie in ru.ServiceMonth vom ersten Tag des Monats zu einer Gruppe müssen verstehen, anstatt der tatsächlichen Wertes.

So etwas wie das.

dateadd(month, datediff(month, 0, ru.ServiceMonth), 0) 
+0

Sean, was brauchst du mehr von mir? –

+0

Nun, wie oben erwähnt, ist der Link ein guter Ausgangspunkt. ;) –

+0

Ich möchte nach dem Monat und Jahr der Servicemoniode gruppieren und das Datum ignorieren. –

Verwandte Themen