Следует создать динамическую сводную таблицу для отчета о продуктах, продаваемых ежемесячно по группам компаний.
- Существует несколько продуктов, и каждая группа компаний может иметь свою комбинацию.
- Статус продукта Активен и Отменен.
- Активные продукты подсчитываются по дате выставления счета (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), промежуточного итога и итогов.
Заранее спасибо за помощь ...
мэри