Создайте динамический запрос для отчета о количестве продуктов в месяц по группе компаний с общими итогами по продукту и по компании - PullRequest
0 голосов
/ 11 мая 2018

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

  • Существует несколько продуктов, и каждая группа компаний может иметь свою комбинацию.
  • Статус продукта Активен и Отменен.
  • Активные продукты подсчитываются по дате выставления счета (dbilldate), а отмененные продукты - по dtContractCancelledDate.
  • В некоторых случаях группа компаний не продает или не отменяет продукт в течение месяца, поэтому все столбцы должны отражать это (см. Prod2 Отменено). Должен существовать столбец расчета для расчета нетто по продукту (Prod Active - Prod Cancelled).

Нам нужна помощь

• Создание другого расчета для подсчета продукта, активного и отмененного с использованием соответствующих дат (dbilled и dtcancelledbilled)

• Создание столбца с 0, когда нет проданных / отмененных продуктов

• Создание чистых столбцов для каждого продукта

• Создание промежуточных итогов в конце каждого столбца

Это желаемый результат:

  Pd1Actv Pd1Cancd  Pd1Net  Prd2Actv Prd2Cancd  Prd2Net   Total
Comp1    6        5        1       15        0        15       16
Comp2   20        6       14       39        0        39       53
Comp3   63       14       49       82        0        82      131
Total   89       25       64      136        0       136      200

Это основная таблица, из которой извлекаются данные

SELECT [iCompId],[sContractStatusCode],[sContractStatusDesc],[dBillDate] ,dtContractCancelledBilled  
FROM [Contract_Header]

Вот что у меня есть до сих пор:

DECLARE 
@cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX),
@Compgroupnumber as varchar(20),
@startdate as date,
@enddate as date

set @startdate=cast(DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0) as
date)
set @enddate=DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0))
set @sCompGroupNumber ='DG10000174'

select @cols = 
STUFF((SELECT distinct  ',' + QUOTENAME(h.sProductCode+'
 '+sContractStatusDesc) 
from [Contract_Header] h
inner join [Comp_Header] d on d.iid=h.icompId
inner join [Comp_CompGroupLink] dgl on d.iId=dgl.CompId
inner join [Comp_DealerGroups] dg on dgl.iCompGroupId=dg.iId
where  (h.sContractStatusCode='A' or h.sContractStatusCode='C') and
(h.dBillDate between @startdate and @enddate)  and
sCompGroupNumber='DG10000174' and 
h.sProductCode in
(                     
  select distinct t.sProductCode
  from [Contract_Header] t
  inner join [Comp_Header] d on d.iid=t.iDealerId
  inner join [Comp_CompGroupLink] dgl on d.iId=dgl.iCompId
  inner join [Comp_CompGroups] dg on dgl.iDealerGroupId=dg.iId
  where  (t.sContractStatusCode='A' or t.sContractStatusCode='C') and
 (t.dBillDate between @startdate and @enddate)  and
  sCompGroupNumber='DG10000174' 
  )FOR XML PATH('')) ,1,1,'')

set @query= 
'SELECT sCompName,' + @cols + ' , +Total
 from 
(
select d.sCompName,
 col = c.sProductCode+'' ''+c.sContractStatusDesc,c.sContractStatusCode,
from [Contract_Header] c
 inner join [Comp_Header] d on d.iid=c.iDealerId
 inner join [Comp_CompGroupLink] dgl on d.iId=dgl.iCompId
 inner join [Comp_CompGroups] dg on dgl.iCompGroupId=dg.iId
 where (dBillDate between '''+CAST(@startdate AS varchar)+''' and 
         '''+CAST(@enddate AS VARCHAR)+''') and 
        sCompGroupNumber='''+'DG10000174'+''' and  
        (c.sContractStatusCode='''+'A'+''' or 
         c.sContractStatusCode='''+'C'+''' ) and 
            sproductcode in

            (select distinct sProductCode 
             from [Contract_Header] t 
              inner join [Comp_Header] d on d.iid=t.iCompId
              inner join [Comp_CompGroupLink] dgl on d.iId=dgl.iCompId
              inner join [Comp_CompGroups] dg on dgl.iCompGroupId=dg.iId
              where (dBillDate between '''+CAST(@startdate AS varchar)+''' 
              and '''+CAST(@enddate AS VARCHAR)+''') and             
              (t.sContractStatusCode='''+'A'+''' or 
               t.sContractStatusCode='''+'C'+''' ) and 
               sCompGroupNumber='''+'DG10000174'+''' 
             ) 
      )  as DataSource
        pivot 
        (
            Count(sContractStatusCode)
            for col in (' + @cols + ')
        ) p order by sCompName' 

execute sp_executesql @query

Это результат запроса выше

    Pd1Actv Pd1Cancd Pd2Actv Pd3Actv    
Comp 1    59      0         59     118      
Comp 2    26      1         25      65      

отсутствуют столбцы, если не отменены продукты для Pd2 и Pd3, нетто-столбцов (pdAct-PdCanc), промежуточного итога и итогов.

Заранее спасибо за помощь ...

мэри

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