2014-05-19 3 views
0

У меня есть следующий запрос:добавив две колонки вместе, чтобы получить сумму от союзного запроса

with abby as (SELECT u.Name as 'UserId1' 
, count(distinct b.id) as 'Total Count' 
, '' as 'ediCount' 

FROM abprot.[FC10y].[dbo].[Batch] b with(nolock) 

inner join abprot.[FC10y].[dbo].[Principal] u with(nolock) on u.Id = b.CreatorId 

where b.CreationDate >= getdate() - 7 
and u.name <> 'abbyyservice' 

group by u.Name) 

, edimon as (select userId 
, '' as 'Total Count' 
, count(*) as 'esubCount' 

from ESubmitTrackingTBL 

where DateCopied >= getdate() - 7 
    and userid <> abbyyservice 

group by UserId 
) 

select * from abby union all select * from edimon 

Мне нужно подвести итоги каждого из КТРА в другое поле пользователя. Я попытался включить другой cte, но получаю предупреждение, что «UserID» и «Total Count» указаны более одного раза.
Если я просто запустить запрос как союзами, результат показан ниже: enter image description here

Конечный результат должен выглядеть следующим образом:

enter image description here

Если я оставил что-нибудь, что может помочь, мои извинения - пожалуйста, дайте мне знать, что я могу добавить, чтобы прояснить это, если это необходимо.

+0

Дважды проверить запрос, который размещен. Похоже, его отрубили. – Jerrad

+0

Спасибо, Jerrad! Это было. –

ответ

1

Я бы обойтись без КТР и просто использовать производную таблицу.

Чтобы избежать проблем при перекрестном выполнении запросов или хранимых процедур, я предпочитаю использовать переменные T-SQL и установить постоянное значение Теперь не нужно для всего прогона. Пересечение границы полуночи и изменение «сегодня» в середине хода могут вызвать ... тонкие проблемы, если вы не будете осторожны с вещами. Не спрашивай меня, как я это знаю.

Итак ...

declare @now   datetime = current_timestamp  -- current instant in time 
declare @today  date  = @now     -- today's date 
declare @cutoff_date date  = dateadd(day,-7,@today) -- 1 week ago 

Ваше значение cutoff_date может изменяться в зависимости от того, требуется ли вам спецификации, глядя на предыдущие 7 календарных дней или предыдущие 168 часов (7 * 24) по отношению к текущему моменту во время).

Так что мой запрос будет выглядеть примерно так:

declare @now   datetime = current_timestamp  -- current instant in time 
declare @today  date  = @now     -- today's date 
declare @cutoff_date date  = dateadd(day,-7,@today) -- 1 week ago 

select user_id  =  x.user_id  , 
     total_count = sum(x.total_count) , 
     edi_count  = sum(x.edi_count ) , 
     grand_total = sum(x.total_count) 
         + sum(x.edi_count ) , 
     esub_count_pct = 100.0 
         * sum(x.edi_count) 
        /( sum(x.total_count) 
          + sum(x.edi_count ) 
         ) 
from ( select user_id  = u.Name , 
       total_count = count(distinct b.id) , 
       esub_count = 0 
     from abprot.FC10y.dbo.Batch  b 
     join abprot.FC10y.dbo.Principal u on u.Id = b.Creator.Id 
              and u.name <> 'abbyyservice' 
     where b.CreationDate >= @cutoff_date 
     group by u.Name 
     UNION ALL 
     select user_id  = t.userId , 
       total_count = 0  , 
       esub_count = 1 
     from dbo.ESubmitTrackingTBL t 
     where t.DateCopied >= @cutoff_date 
    ) x 
group by x.user_id 
+0

Благодарим вас за помощь, Николас Кэри. Это решение обеспечило именно то, что мне нужно. –

0

Ваш запрос выглядел отрубленным. Я предполагаю, что вам просто нужно то, что находится в последнем CTE.

Расчет довольно прост. Я немного удивлен тем, что кто-то, кто мог бы собрать этот SQL не будет выяснить окончательный расчет:

with abby as (
     SELECT u.Name as UserId, count(distinct b.id) as [Total Count], '' as ediCount 
     FROM abprot.[FC10y].[dbo].[Batch] b with(nolock) inner join 
      abprot.[FC10y].[dbo].[Principal] u with(nolock) 
      on u.Id = b.CreatorId 
     where b.CreationDate >= getdate() - 7 and u.name <> 'abbyyservice' 
     group by u.Name 
    ), 
    edimon as (
    select userId, '' as [Total Count], count(*) as esubCount 
    from ESubmitTrackingTBL 
    where DateCopied >= getdate() - 7 and userid <> abbyyservice 
    ) 
select userId, [Total Count], esubcount, ([Total Count] + esubcount) as Total, 
     100.0 * esubcount/([Total Count] + esubcount) as [percent edisubcount] 
from edimon; 

Слово совет: не использовать одинарные кавычки для идентификаторов. Предпочтительно использовать имена (например, userid), которые не требуют экранирования. Если вы это сделаете, используйте квадратные скобки.

EDIT:

Ваша проблема, наверное, проще, чем вы делаете это, чтобы быть. Попробуйте использовать group by with rollup:

SELECT u.Name as UserId, count(distinct b.id) as [Total Count], '' as ediCount, 
     ([Total Count] + esubcount) as Total, 
     100.0 * esubcount/([Total Count] + esubcount) as [percent edisubcount] 
FROM abprot.[FC10y].[dbo].[Batch] b with(nolock) inner join 
    abprot.[FC10y].[dbo].[Principal] u with(nolock) 
    on u.Id = b.CreatorId 
where b.CreationDate >= getdate() - 7 and u.name <> 'abbyyservice' 
group by u.Name with rollup; 
+0

Спасибо, Гордон Линофф. Я ценю помощь. Когда я запускал то, что вы предоставили, и просматривал результаты, я пропускаю одну строку из того, что получаю, когда я запускаю ее как запрос UNION (без итогов и процентов. Эта запись будет поступать из abby CTE, а не из edimon cte.Эта запись должна быть в окончательных результатах. –

0
with abby as (
     SELECT u.Name as UserId, count(distinct b.id) as [Total Count], '' as ediCount 
     FROM abprot.[FC10y].[dbo].[Batch] b with(nolock) inner join 
      abprot.[FC10y].[dbo].[Principal] u with(nolock) 
      on u.Id = b.CreatorId 
     where b.CreationDate >= getdate() - 7 and u.name <> 'abbyyservice' 
     group by u.Name 
    ), 
    edimon as (
    select userId, '' as [Total Count], count(*) as esubCount 
    from ESubmitTrackingTBL 
    where DateCopied >= getdate() - 7 and userid <> 'abbyyservice' 
    ) 

select UserId, 
    TotalCount, 
    esubCount, 
    convert(decimal, esubCount)/(convert(decimal, TotalCount) + convert(decimal, esubCount)) percentesubCount 
from (select * from abby 
     union 
     select * from edimon) x 
Смежные вопросы