使用SUM函数的DB2导致SQL错误[S1000]:一般错误

6tqwzwtp  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(148)

我正在尝试收集一个项目的销售数据,但我在主查询中使用的cte查询出现了问题。

SELECT
    CONCAT(
      CONCAT(
       VARCHAR_FORMAT(INFO.DATE, 'YYYYMMDD'),
       CAST(INFO.INVOICE AS VARCHAR)
      ), 
      CAST(INFO.STORE AS VARCHAR)
    ) AS HEADER,
    CASE WHEN INFO.CUSTOMER_NUMBER IN (999990, 999991) 
      THEN 'CASH' ELSE 'CHARGE' END AS CUST_TYPE,
    INFO.STORE,
    INFO.INVOICE,
    INFO.DATE,
    INFO.SALES_UNITS,
    INFO.SALES
FROM
    DATALAKE.SLSINFO INFO
WHERE 
    INFO.DATE >= '2019-01-01'
    AND INFO.STORE = 163
    AND INFO.INVOICE = 100349
ORDER BY 
    HEADER ASC

此查询应创建一个唯一的标题,然后使用客户编号将发票分类为现金客户或借记客户,并返回一些关联值。
在本例中,我查看特定的日期/商店/发票进行测试,结果是:
| 集管|客户类型|储存|发票|日期|销售_单位|销售部|
| - -|- -|- -|- -|- -|- -|- -|
| 20190101100349163号文件|现金|一百六十三|小行星100349| 2019年1月1日|四个|九点九六分|
| 20190101100349163号文件|现金|一百六十三|小行星100349| 2019年1月1日|一个|十点九十九分|
| 20190101100349163号文件|现金|一百六十三|小行星100349| 2019年1月1日|一个|二点九九分|
我尝试通过添加SALES_UNITS和SALES列,为每个唯一的标题创建一行。我尝试使用的查询如下:

SELECT
    CONCAT(CONCAT(VARCHAR_FORMAT(INFO.DATE, 'YYYYMMDD'), CAST(INFO.INVOICE AS VARCHAR)), CAST(INFO.STORE AS VARCHAR)) AS HEADER,
    CASE WHEN INFO.CUSTOMER_NUMBER IN (999990, 999991) THEN 'CASH' ELSE 'CHARGE' END AS CUST_TYPE,
    INFO.STORE,
    INFO.INVOICE,
    INFO.DATE,
    SUM(INFO.SALES_UNITS) AS UNITS,
    SUM(INFO.SALES) AS SALES
FROM
    DATALAKE.SLSINFO INFO
WHERE 
    INFO.DATE >= '2019-01-01'
    AND INFO.STORE = 163
    AND INFO.INVOICE = 100349
ORDER BY 
    HEADER ASC

理想的输出如下所示
| 集管|客户类型|储存|发票|日期|单位|销售部|
| - -|- -|- -|- -|- -|- -|- -|
| 20190101100349163号文件|现金|一百六十三|小行星100349| 2019年1月1日|六个|二十三点九四|
但是,第二个查询没有运行,我收到SQL错误[S1000]:一般错误,无其他信息。
我已经尝试过在原始查询和第二个查询中按标题分组,但它不允许我按任何内容分组,我还没有弄清楚为什么会这样。
任何见解都将不胜感激!

yebdmbv4

yebdmbv41#

您可以使用with子句给予原始查询命名(我将其命名为T),然后只获取总和并按其他列分组。

With T as (
  SELECT 
    CONCAT(
      CONCAT(
        VARCHAR_FORMAT(INFO.DATE, 'YYYYMMDD'), 
        CAST(INFO.INVOICE AS VARCHAR)
      ), 
      CAST(INFO.STORE AS VARCHAR)
    ) AS HEADER, 
    CASE WHEN INFO.CUSTOMER_NUMBER IN (999990, 999991) THEN 'CASH' ELSE 'CHARGE' END AS CUST_TYPE, 
    INFO.STORE, 
    INFO.INVOICE, 
    INFO.DATE, 
    INFO.SALES_UNITS, 
    INFO.SALES 
  FROM 
    DATALAKE.SLSINFO INFO 
  WHERE 
    INFO.DATE >= '2019-01-01' 
    AND INFO.STORE = 163 
    AND INFO.INVOICE = 100349
) 
select 
  Header, 
  cust_type, 
  store, 
  invoice, 
  date, 
  SUM(SALES_UNITS) AS UNITS, 
  SUM(SALES) AS SALES 
from 
  t 
group by 
  Header, 
  cust_type, 
  store, 
  invoice, 
  date 
order by 
  Header

相关问题