2016-08-09 3 views
0

У меня есть запрос следующим образомGroup за месяц и год столбца даты

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 

Исполняя результат является

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 

Если вы следите за колонкой обслуживание месяц для contractor_id = 846 мы можем видеть 2 записи с тем же месяцем. Я хочу, чтобы результат объединял эти столбцы, как один с 2016-07-01, а другой - с 2016-07-31, поскольку оба они принадлежат одному и тому же месяцу и году. Я хочу, чтобы они были объединены.

Может ли кто-нибудь помочь в этом?

+0

Последний столбец должен иметь 1000 + 200 = 1200? – Whencesoever

+0

То же самое с UnitsDelivered? – Whencesoever

+0

Вы группируете мой ServiceMonth, но у вас разные значения в выводе. У вас есть 7/1 и 7/31 для подрядчика 846. Это похоже на то, что, пожалуй, столбец плохо назван, потому что это будет дата службы, а не месяц. Вы хотите группировать (и выводить) первый день месяца. –

ответ

0

Вы действительно должны привыкнуть использовать псевдонимы и форматировать свои запросы. Как указано, этот запрос невозможно расшифровать. С помощью всего лишь нескольких псевдонимов и небольшого форматирования намного чище.

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 

Чтобы действительно помочь с вашей проблемой, я думаю, нам нужно немного подробнее. Это отличное место для начала. http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/

--EDIT--

Если я правильно понял вопрос, что нужно сгруппировать первым из месяца в ru.ServiceMonth вместо фактического значения.

Нечто подобное.

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

Шон, что вам нужно от меня? –

+0

Хорошо, как упоминалось выше, ссылка - отличное место для начала. ;) –

+0

Я хочу сгруппировать по месяцам и годам servicemonth, игнорируя дату. –

Смежные вопросы