SQL Server - Создание сгруппированных столбцов - PullRequest
0 голосов
/ 23 октября 2019

Мне нужно создать несколько столбцов, в которых я суммирую значения для создания набора данных «сгруппированных» значений. Вот данные, которые у меня есть, и ниже, что мне нужно в качестве вывода. Любая помощь приветствуется!

Текущий набор данных

Reference ID    Numerator   Denominator Cycle Value Action Plan
CLM-12-FLC-MMA  90  100 90% A
CLM-12-FLC-LTC  80  100 80% B
CLM-13-FLC-MMA  120 200 60% A
CLM-13-FLC-LTC  200 200 100%    B
CLM-16-FLC-MMA  25  50  50% A
CLM-16-FLC-LTC  50  50  100%    B

Требуется вывод

**Grouped Ref ID**  Reference ID    Numerator   Denominator Cycle Value **Grouped Numerator Grouped Denominator Grouped Cycle Value**   Action Plan
CLM-12-FLC  CLM-12-FLC-MMA  90  100 90% 170 200 85% A
CLM-12-FLC  CLM-12-FLC-LTC  80  100 80% 170 200 85% B
CLM-13-FLC  CLM-13-FLC-MMA  120 200 60% 320 400 80% A
CLM-13-FLC  CLM-13-FLC-LTC  200 200 100%    320 400 80% B
CLM-16-FLC  CLM-16-FLC-MMA  25  50  50% 75  100 75% A
CLM-16-FLC  CLM-16-FLC-LTC  50  50  100%    75  100 75% B

Новое обновление кода:

select 
    GroupedRefID = x.NewRefID
    ,ss.[Reference ID]
    , s.[Numerator Value]
    , s.[Denominator Value]
    , convert(varchar(10), s.[Cycle Value]) + '%'
    , GroupedNumerator = x.NumeratorTotal
    , GroupedDenominator = x.DenominatorTotal
    , GroupedCycleValue = convert(varchar(10), convert(int, 100 * (x.NumeratorTotal / (x.DenominatorTotal * 1.0) /*need to multiple by 1.0 so this becomes a decimal*/))) + '%'
    , s.[Action Plan to be Compliant]
from MEACycleSnapShot s
    left join MEACONFIGSnapshot ss
    on s.Configuration = ss.[Configuration Number]

where convert(date,s.CreatedOn) = 
(select max(convert(date,CreatedOn)) from s)
and convert(date,ss.CreatedOn) = 
(select max(convert(date,CreatedOn)) from ss) 
and convert(date,s.EndofReportingPeriod) > '02/01/2016'
and ss.[MEA Set] in ('Medicaid - Metrics', 'Medicare - Metrics')
and ss.[Configuration Status] in ('Active','Gap')
and ss.[Reference ID] IN ('CLM-12-FLC-LTC','CLM-12-FLC-MMA','CLM-13-FLC-LTC','CLM-13-FLC-MMA','CLM-16-FLC-LTC','CLM-16-FLC-MMA','CLM-17-FLC-LTC','CLM-17-FLC-MMA') 

cross apply

(select NewRefID = left([Reference ID], LEN([Reference ID]) - charindex('-', reverse([Reference ID])))
    , NumeratorTotal = sum(cast([Numerator Value] as float))
    , DenominatorTotal = sum(cast([Denominator Value] as float))
 from MEACycleSnapShot
    left join MEACONFIGSnapshot
    on MEACycleSnapShot.Configuration = MEACONFIGSnapshot.[Configuration Number]
    where convert(date,MEACycleSnapShot.CreatedOn) = 
    (select max(convert(date,CreatedOn)) from MEACycleSnapShot)
    and convert(date,MEACONFIGSnapshot.CreatedOn) = 
    (select max(convert(date,CreatedOn)) from MEACONFIGSnapshot) 
    and convert(date,MEACycleSnapShot.EndofReportingPeriod) > '02/01/2016'
    and MEACONFIGSnapshot.[MEA Set] in ('Medicaid - Metrics', 'Medicare - Metrics')
    and MEACONFIGSnapshot.[Configuration Status] in ('Active','Gap')
    and [Reference ID] IN ('CLM-12-FLC-LTC','CLM-12-FLC-MMA','CLM-13-FLC-LTC','CLM-13-FLC-MMA','CLM-16-FLC-LTC','CLM-16-FLC-MMA','CLM-17-FLC-LTC','CLM-17-FLC-MMA')
    and left([Reference ID], LEN([Reference ID]) - charindex('-', reverse([Reference ID]))) = left([Reference ID], LEN([Reference ID]) - charindex('-', reverse([Reference ID])))
    group by left([Reference ID], LEN([Reference ID]) - charindex('-', reverse([Reference ID])))) x

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Одна из главных причин, по которой вы здесь боретесь, заключается в том, что вы, по-видимому, нарушили 1NF, вставив несколько значений в столбец ReferenceID. Это означает, что вы должны перепрыгнуть через кучу препятствий, чтобы распутать это. Если я понимаю, что вы ищете, это должно сработать.

Обратите внимание, как я создал некоторые образцы данных в формате расходных материалов? Вот как вы должны представить данные в будущем. Это позволяет другим легко работать над вашей проблемой. : D

declare @Something table
(
    ReferenceID varchar(25)
    , Numerator int
    , Denominator int
    , CycleValue int
    , ActionPlan char(1)
)

insert @Something values
('CLM-12-FLC-MMA', 90, 100, 90, 'A')
, ('CLM-12-FLC-LTC', 80, 100, 80, 'B')
, ('CLM-13-FLC-MMA', 120, 200, 60, 'A')
, ('CLM-13-FLC-LTC', 200, 200, 100, 'B')
, ('CLM-16-FLC-MMA', 25, 50, 50, 'A')
, ('CLM-16-FLC-LTC', 50, 50, 100, 'B')

select GroupedRefID = x.NewRefID
    , s.ReferenceID
    , s.Numerator
    , s.Denominator
    , convert(varchar(10), s.CycleValue) + '%'
    , GroupedNumerator = x.NumeratorTotal
    , GroupedDenominator = x.DenominatorTotal
    , GroupedCycleValue = convert(varchar(10), convert(int, 100 * (x.NumeratorTotal / (x.DenominatorTotal * 1.0) /*need to multiple by 1.0 so this becomes a decimal*/))) + '%'
    , s.ActionPlan
from @Something s
cross apply
(
    select NewRefID = left(s2.ReferenceID, LEN(s2.ReferenceID) - charindex('-', reverse(s2.ReferenceID)))
        , NumeratorTotal = sum(s2.Numerator)
        , DenominatorTotal = sum(s2.Denominator)
    from @Something s2
    where left(s2.ReferenceID, LEN(s2.ReferenceID) - charindex('-', reverse(s2.ReferenceID))) = left(s.ReferenceID, LEN(s.ReferenceID) - charindex('-', reverse(s.ReferenceID)))
    group by left(s2.ReferenceID, LEN(s2.ReferenceID) - charindex('-', reverse(s2.ReferenceID)))
) x
0 голосов
/ 23 октября 2019

Вы, кажется, хотите суммировать на основе первых 10 символов ссылки. Используйте оконные функции и left():

select t.*,
       sum(numerator) over (partition by left(reference_id, 10)),
       sum(denominator) over (partition by left(reference_id, 10)),
       sum(cycle) over (partition by left(reference_id, 10)),
from t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...