Как сгруппировать динамическую сводную таблицу - PullRequest
0 голосов
/ 10 июня 2019

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

Я уже пытаюсь повторить код в C # Entity Framework, но у меня тот же результат не работает

DECLARE @fch1 NVARCHAR(10) = '2019-01-01';
DECLARE @fch2 NVARCHAR(10) = '2019-05-31';

DECLARE @query NVARCHAR(MAX);

Declare  @colc nvarchar(MAX) = STUFF((SELECT DISTINCT','+QUOTENAME(concat(year(e.FECHADOCTO),month(e.FECHADOCTO),'C'))
                         FROM EDocumentos e WHERE e.FECHADOCTO between @fch1 and @fch2
                         FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'), 1, 1, '');
Declare  @colv nvarchar(MAX) = STUFF((SELECT DISTINCT','+QUOTENAME(concat(year(e.FECHADOCTO),month(e.FECHADOCTO),'V'))
                         FROM EDocumentos e WHERE e.FECHADOCTO between @fch1 and @fch2
                         FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'), 1, 1, '');
Declare  @colf nvarchar(MAX) = STUFF((SELECT DISTINCT','+QUOTENAME(concat(year(e.FECHADOCTO),month(e.FECHADOCTO),'F'))
                         FROM EDocumentos e WHERE e.FECHADOCTO between @fch1 and @fch2
                         FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'), 1, 1, '');
    print @colc;

SET @query = 'SELECT MARCA, '+@colc+','+@colv+','+@colf+' from (
                    SELECT  p.MARCA,
                            concat(year(e.FECHADOCTO),month(e.FECHADOCTO),''C'') as [colc],
                            concat(year(e.FECHADOCTO),month(e.FECHADOCTO),''V'') as [colv],
                            concat(year(e.FECHADOCTO),month(e.FECHADOCTO),''F'') as [colf],
                            sum(d.CANTIDAD) as cant, 
                            sum(d.TOTAL-d.TDESCU) as venta,
                            (sum(d.TOTAL-d.TDESCU)/sum(d.COSTO*d.CANTIDAD)) as factor
                    from    EDocumentos e left join DDocumentos d on e.CVE_DOCTO=d.CVE_DOCTO
                            left join Productos p on d.CVE_PRODUCTO=p.CVE_PRODUCTO
                            left join Vendedores v on e.CVE_VEND=v.CVE_VEND
                    where   e.FECHADOCTO between '''+@fch1+''' and '''+@fch2+'''
                            and v.CLASIFICACION in (''CTRAL'',''DEPTO'',''COMPA'', ''OFICI'', ''BAZAR'', ''INSTA'')
                            and e.ESTADO <> ''C'' and e.TIPODOCTO = ''F'' 
                    group   by  p.MARCA, year(e.FECHADOCTO), month(e.FECHADOCTO) 
                    )x
                    pivot (sum(cant) for [colc] in ('+@colc+')) as pc
                    pivot (sum(venta) for [colv] in ('+@colv+')) as pv
                    pivot (avg(factor) for [colf] in ('+@colf+')) as pf';
print @query;
EXECUTE (@query);

это фактический результат фактический

это ожидаемый результат ожидается

1 Ответ

0 голосов
/ 10 июня 2019

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

SQL DEMO

  • in cte Вы рассчитываете SUM и AVG
  • в базе вы создаете метку поверх той, которую будете делать в центре
    • Вы также можете сделать UNPIVOT вместо UNION ALL, но я не думаю, что это необходимо для этого случая.
  • тогда вы можете сделать обычный поворот (здесь вы можете включить динамическую часть позже)

Запрос:

with cte as (
  SELECT [type], [years], MAX([value]) as maxv, AVG([value]) as avgv
  FROM Table1
  GROUP BY [type], [years]
), 
base as (
  SELECT [type], cast([years] as nvarchar) + '_maxv' as calc, maxv as value
  FROM cte
  UNION ALL
  SELECT [type], cast([years] as nvarchar) + '_avgv' as calc, avgv as value
  FROM cte
)

SELECT [type], [2017_maxv], [2017_avgv], [2018_maxv], [2018_avgv] 
FROM ( SELECT [type], [calc], [value]
       FROM base ) p
PIVOT ( 
        MAX(value) FOR
        calc IN ([2017_maxv], [2017_avgv], [2018_maxv], [2018_avgv])
       ) as pvt

OUTPUT

| type | 2017_maxv | 2017_avgv | 2018_maxv | 2018_avgv |
|------|-----------|-----------|-----------|-----------|
|    A |        10 |        10 |        20 |        20 |
|    B |        30 |        30 |        40 |        40 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...