Oracle SQL:简化多个 select 语句

发布于 2024-12-20 00:53:45 字数 5113 浏览 1 评论 0原文

我需要对一年中的每个月进行计数,所以我这样做:

SELECT 
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '01' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS jan,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '02' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS fev,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '03' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS mar,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '04' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS abr,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '05' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS mai,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '06' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS jun,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '07' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS jul,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '08' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS ago,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '09' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS stb,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '10' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS out,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '11' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS nov,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '12' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS dez

FROM dual

有没有办法简化这个? 干杯。

I need to do a COUNT for each month in a year so I do this:

SELECT 
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '01' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS jan,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '02' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS fev,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '03' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS mar,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '04' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS abr,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '05' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS mai,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '06' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS jun,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '07' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS jul,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '08' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS ago,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '09' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS stb,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '10' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS out,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '11' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS nov,
(
    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
    to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '12' AND
    {PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS dez

FROM dual

Is there a way to simplify this?
Cheers.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

德意的啸 2024-12-27 00:53:45

尝试:

SELECT COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '01' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS jan,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '02' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS fev,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '03' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS mar,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '04' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS abr,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '05' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS mai,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '06' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS jun,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '07' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS jul,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '08' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS ago,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '09' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS stb,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '10' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS out,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '11' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS nov,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '12' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS dez
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

包括一种相当通用的旋转结果的方法。请注意,由于年份没有限制,因此多年的数据可能会出现在每个月的结果中 - 这对于原始查询也是如此。

Try:

SELECT COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '01' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS jan,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '02' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS fev,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '03' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS mar,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '04' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS abr,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '05' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS mai,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '06' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS jun,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '07' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS jul,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '08' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS ago,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '09' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS stb,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '10' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS out,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '11' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS nov,
       COUNT(CASE WHEN to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '12' 
                  THEN {ENCOMENDA_LINHA}.[Quantidade]) END) AS dez
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

Includes a fairly generic method of pivoting the results. Note that since there is no restriction on year, data from multiple years could be appearing in each month's results - this would also be true of the original query.

把时间冻结 2024-12-27 00:53:45

这是枢轴操作。在 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
    )

免责声明:未经测试。检查您语言中的月份短名称。

This is a pivot operation. In 11G:

sample:

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    

with your code:

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')
    )

For previous version, sample:

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;

for your code:

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
    )

disclaimer: not tested. Check for month short names in your language.

水溶 2024-12-27 00:53:45

创建一个包含所需值(月份和数量)的临时表。

SELECT to_char({ENCOMENDA}.[DataSubmissao], 'MM'), 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

然后从中选择您需要的内容。

Create a temporary table with the needed values (month and quantity).

SELECT to_char({ENCOMENDA}.[DataSubmissao], 'MM'), 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

And afterwords select what you need from it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文