Это операция поворота. В 11G:
образец
SELECT *
FROM (SELECT job, deptno, sum(sal) sal FROM emp GROUP BY job, deptno)
PIVOT ( sum(sal) FOR deptno IN (10, 20, 30, 40) );
JOB 10 20 30 40
--------- ---------- ---------- ---------- ----------
CLERK 1300 1900 950
SALESMAN 5600
PRESIDENT 5000
MANAGER 2450 2975 2850
ANALYST
с вашим кодом:
SELECT *
FROM
( SELECT
COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA}
ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO}
on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE
{ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
PIVOT ( COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FOR to_char({ENCOMENDA}.[DataSubmissao], 'MON') IN
('JAN','FEB','MAR', ..., 'DEC')
)
Для предыдущей версии, образец:
SELECT *
FROM (SELECT job,
sum(decode(deptno,10,sal)) DEPT10,
sum(decode(deptno,20,sal)) DEPT20,
sum(decode(deptno,30,sal)) DEPT30,
sum(decode(deptno,40,sal)) DEPT40
FROM scott.emp
GROUP BY job)
ORDER BY 1;
для вашего кода:
SELECT *
FROM
( SELECT
COUNT( decode( to_char({ENCOMENDA}.[DataSubmissao], 'MON'),
'JAN',
{ENCOMENDA_LINHA}.[Quantidade]
)
) JAN,
COUNT( decode( to_char({ENCOMENDA}.[DataSubmissao], 'MON'),
'FEB',
{ENCOMENDA_LINHA}.[Quantidade]
)
) FEB,
...
COUNT( decode( to_char({ENCOMENDA}.[DataSubmissao], 'MON'),
'DEC',
{ENCOMENDA_LINHA}.[Quantidade]
)
) DEC,
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA}
ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO}
on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE
{ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
)
отказ от ответственности: не проверено. Проверьте короткие названия месяцев на вашем языке.