【问题标题】:PLSQL results to Pivot TablePLSQL 结果到数据透视表
【发布时间】:2022-01-08 19:51:35
【问题描述】:

我想在 PLSQL 中运行查询以获取数据表中过去六个月内的销售数量总和,并将其按月分配给列。

到目前为止,我执行此代码来选择我想要的数据

SELECT 
  * 
FROM 
  (
    select 
      CATALOG_NO as PartNo, 
      to_char(INVOICE_DATE, 'MM') as tday, 
      sum(INVOICED_QTY) as qty 
    from 
      db.INV_ITEM_JOIN 
    WHERE 
      upper(CATALOG_GROUP) = upper('SPAM') 
      AND INVOICE_DATE between add_months(
        trunc(sysdate, 'mm'), 
        -6
      ) 
      and last_day(
        add_months(
          trunc(sysdate, 'mm'), 
          -1
        )
      ) 
    group by 
      to_char(INVOICE_DATE, 'MM'), 
      CATALOG_NO 
    order by 
      CATALOG_NO
  )

然后我得到结果,为了创建 PIVOT,我在 select Query 之后添加了这段代码

PIVOT (
  SUM(qty) FOR TDAY IN (
    01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 
    12
  )
)

所以一旦我添加它返回表为PartNo,01,02,03,04,05,06,07,08,@ 987654332@,10,11,12 同样明智。

但数据只到101112月份,其他的不填。我可以寻求帮助来解决这个问题吗?

【问题讨论】:

  • 我们应该知道样本数据集以便能够帮助您

标签: sql oracle pivot


【解决方案1】:

TO_CHAR(INVOICE_DATE, 'MM') 输出一个用零填充的两位数字符串,因此您可以使用:

PIVOT (
  SUM(qty) FOR TDAY IN (
    '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'
  )
)

或者,使用EXTRACT(MONTH FROM invoice_date) 代替TO_CHAR,然后您可以使用数值:

SELECT * 
FROM   (
  select CATALOG_NO as PartNo, 
         EXTRACT(MONTH FROM INVOICE_DATE) as tday, 
         sum(INVOICED_QTY) as qty 
  from   db.INV_ITEM_JOIN 
  WHERE  upper(CATALOG_GROUP) = 'SPAM'
  AND    INVOICE_DATE >= add_months(trunc(sysdate, 'mm'), -6) 
  AND    INVOICE_DATE <  trunc(sysdate, 'mm')
  GROUP BY 
         EXTRACT(MONTH FROM INVOICE_DATE), 
         CATALOG_NO 
  order by 
         CATALOG_NO
)
PIVOT (
  SUM(qty) FOR TDAY IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
)

顺便说一句:

INVOICE_DATE between add_months(trunc(sysdate, 'mm'), -6) 
                 and last_day(add_months(trunc(sysdate, 'mm'), -1))

将排除具有上个月最后一天 00:00:01 到 23:59:59 的时间分量的值。如果要包括整个范围,请使用:

AND    INVOICE_DATE >= add_months(trunc(sysdate, 'mm'), -6) 
AND    INVOICE_DATE <  trunc(sysdate, 'mm')

db小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 2021-01-29
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多