【问题标题】:SQL VBA Group by error with TRUNC() functionSQL VBA 使用 TRUNC() 函数按错误分组
【发布时间】:2020-11-16 07:56:07
【问题描述】:

我正在对 vba excel 进行查询,我对此查询有疑问:

SQLStr = "SELECT DISTINCT (t2.COD_CF) AS CODICE_CLIENTE, (t2.RAG_SOC_CF) AS CLIENTE, (t1.DES_HEAD_DOC) AS COMMESSA_E_DESCRIZIONE, t1.DATA_PREV_FIN_LAV AS GREZZO_CONFERMATO,  MIN(t4.DATA_INIZIO) AS PRIMO_CARICO, MAX(t4.DATA_FINE) AS ULTIMO_CARICO, " & _
"(TRUNC(MAX(t1.DATA_PREV_FIN_LAV)) - TRUNC(t4.DATA_INIZIO) ) - " & _
"((((TRUNC(MAX(t1.DATA_PREV_FIN_LAV),'D'))-(TRUNC(t4.DATA_INIZIO,'D')))/7)*2) - " & _
"(CASE WHEN TO_CHAR(t4.DATA_INIZIO,'DY','nls_date_language=english')='SUN' THEN 1 ELSE 0 END) - " & _
"(CASE WHEN TO_CHAR(MAX(t1.DATA_PREV_FIN_LAV),'DY','nls_date_language=english')='SAT' THEN 1 ELSE 0 END) as GG_DIFFERENZA " & _
"FROM COMM_LAV t1 " & _
"INNER JOIN CF t2 ON t1.COD_CF_INTE = t2.COD_CF " & _
"INNER JOIN COMM_LAV_LNK t3 ON t1.DOC_ID = t3.DOC_ID " & _
"INNER JOIN ORP_EFF_CICLI_ESEC t4 ON t3.LNK_DOC_ID = t4.DOC_ID " & _
"WHERE t1.DATA_PREV_FIN_LAV >= '" & startDate & "' AND t1.DATA_PREV_FIN_LAV <= '" & endDate & "' AND t4.COD_CICLO <> 'LEV01' " & _
"GROUP BY t2.COD_CF, t2.RAG_SOC_CF, t1.DES_HEAD_DOC, t1.DATA_PREV_FIN_LAV " & _
"ORDER BY t1.DES_HEAD_DOC, t1.DATA_PREV_FIN_LAV, MIN(t4.DATA_INIZIO) "

我收到此错误:ORA-00979: not a GROUP BY 表达式 只有当我执行 TRUNC() 函数时才会出现此错误,有人可以帮助我并解释这个组

更新 我尝试使用 oracle,并像这样编辑查询:

SELECT (t2.COD_CF) AS CODICE_CLIENTE, (t2.RAG_SOC_CF) AS CLIENTE, (t1.DES_HEAD_DOC) AS COMMESSA_E_DESCRIZIONE, t1.DATA_PREV_FIN_LAV AS GREZZO_CONFERMATO,  MIN(t4.DATA_INIZIO) AS PRIMO_CARICO, MAX(t4.DATA_FINE) AS ULTIMO_CARICO,  
(TRUNC(MAX(t1.DATA_PREV_FIN_LAV)) - TRUNC(t4.DATA_INIZIO)) AS DIFF
FROM COMM_LAV t1
INNER JOIN CF t2 ON t1.COD_CF_INTE = t2.COD_CF 
INNER JOIN COMM_LAV_LNK t3 ON t1.DOC_ID = t3.DOC_ID 
INNER JOIN ORP_EFF_CICLI_ESEC t4 ON t3.LNK_DOC_ID = t4.DOC_ID 
WHERE t1.DATA_PREV_FIN_LAV >= '01-OCT-20' AND t1.DATA_PREV_FIN_LAV <= '30-OCT-20' AND t4.COD_CICLO <> 'LEV01' 
GROUP BY t2.COD_CF, t2.RAG_SOC_CF, t1.DES_HEAD_DOC, t1.DATA_PREV_FIN_LAV
ORDER BY t1.DES_HEAD_DOC, t1.DATA_PREV_FIN_LAV, MIN(t4.DATA_INIZIO)

但我总是出现这个错误:ORA-00979: not a GROUP BY expression

为什么 trunc 函数给我这个错误?

【问题讨论】:

  • 您通常 GROUP BY 与您选择的列相同,但那些作为设置函数的参数的列除外。
  • DISTINCT 不是函数,它是SELECT DISTINCT 的一部分,适用于整个选定的行。
  • GROUP BY 消除重复行,因此无需执行 SELECT DISTINCT。
  • 我试图不使用 distinct,但我有同样的错误,如果我不把 TRUNC() 函数工作,那为什么?
  • 您应该首先使用 SQL developer 或类似的工具创建您的 SQL 语句。只要它不在那里工作,它也不能从 VBA 工作。仅当它在那里工作时,才将其放入 VBA。 ♦ 使用 ADODB.Parameter 将日期标准传递给 Oracle,请参阅 stackoverflow.com/a/60640185/7599798 ♦ 要检查日期是否为 Sunday,您应该使用 Oracle Weekday 函数

标签: sql vba oracle group-by


【解决方案1】:

GROUP BY 子句需要包含 SELECT 中所有未被 GROUPED 的字段。你省略了这个:

(TRUNC(MAX(t1.DATA_PREV_FIN_LAV)) - TRUNC(t4.DATA_INIZIO)) AS DIFF

即使您在其中有一个聚合函数 (MAX),总体而言这是一条 TRUNC 语句,因此不是聚合。

我认为逻辑上以下2个语句是相同的(至少只要B

MAX(A) - B == MAX(A-B)

因此,您应该能够将您的语句重写为以下内容,并且仍然得到相同的结果:

MAX(TRUNC(t1.DATA_PREV_FIN_LAV) - TRUNC(t4.DATA_INIZIO)) AS DIFF

【讨论】:

    【解决方案2】:

    您在GROUP BY 中缺少TRUNC(t4.DATA_INIZIO) 列:

    SELECT t2.COD_CF AS CODICE_CLIENTE, t2.RAG_SOC_CF AS CLIENTE,
           t1.DES_HEAD_DOC AS COMMESSA_E_DESCRIZIONE, 
           t1.DATA_PREV_FIN_LAV AS GREZZO_CONFERMATO,
           MIN(t4.DATA_INIZIO) AS PRIMO_CARICO,
           MAX(t4.DATA_FINE) AS ULTIMO_CARICO,  
           (TRUNC(MAX(t1.DATA_PREV_FIN_LAV)) - 
            TRUNC(t4.DATA_INIZIO)
    --------^ Not in GROUP BY
           ) AS DIFF
    FROM COMM_LAV t1 JOIN
         CF t2 
         ON t1.COD_CF_INTE = t2.COD_CF JOIN
         COMM_LAV_LNK t3
         ON t1.DOC_ID = t3.DOC_ID JOIN
         ORP_EFF_CICLI_ESEC t4
         ON t3.LNK_DOC_ID = t4.DOC_ID JOIN
    WHERE t1.DATA_PREV_FIN_LAV >= DATE '2020-10-01' AND 
          t1.DATA_PREV_FIN_LAV <= DATE '2020-10-30' AND
          t4.COD_CICLO <> 'LEV01' 
    GROUP BY t2.COD_CF, t2.RAG_SOC_CF, t1.DES_HEAD_DOC, t1.DATA_PREV_FIN_LAV,
             TRUNC(t4.DATA_INIZIO)
    ---------^ add to GROUP BY
    ORDER BY t1.DES_HEAD_DOC, t1.DATA_PREV_FIN_LAV, MIN(t4.DATA_INIZIO);
    

    请注意,Oracle 支持使用 DATE 关键字的日期文字。我强烈建议您使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 2018-06-02
      相关资源
      最近更新 更多