Oracle SQL Groupby和SUM

时间:2015-05-09 22:01:43

标签: sql oracle group-by sum

我有以下查询,将每个投标ID和描述分组并显示其总和:

3020    American Express             20
1000    Cash - primary currency      9903.25
3120    House Card                   2605.56
4070    Purchase Order               668.25
3000    Visa                         26005.19

SELECT B.TENDER_TYPE_ID, A.TENDER_TYPE_DESC, SUM (B.TENDER_AMT)
FROM POS_TENDER_TYPE_HEAD A, SA_TRAN_TENDER B, SA_TRAN_HEAD C
WHERE A.TENDER_TYPE_ID = B.TENDER_TYPE_ID AND B.TRAN_SEQ_NO = C.TRAN_SEQ_NO
GROUP BY B.TENDER_TYPE_ID, A.TENDER_TYPE_DESC

在表格 C(SA_TRAN_HEAD)中,有一个字段 TRAN_DATETIME。 我希望查询返回日期间隔之间的结果,但不希望日期显示在查询列中。

我能做些什么来实现这个目标?

1 个答案:

答案 0 :(得分:1)

只需在WHERE子句中添加所需的日期范围:

SELECT B.TENDER_TYPE_ID,
       A.TENDER_TYPE_DESC,
      SUM (B.TENDER_AMT)
FROM POS_TENDER_TYPE_HEAD A,
     SA_TRAN_TENDER B,
     SA_TRAN_HEAD C
WHERE A.TENDER_TYPE_ID = B.TENDER_TYPE_ID AND
      B.TRAN_SEQ_NO = C.TRAN_SEQ_NO AND
      C.TRAN_DATETIME BETWEEN TO_DATE('01-JAN-2015', 'DD-MON-YYYY')
                          AND TO_DATE('31-MAR-2015', 'DD-MON-YYYY')
GROUP BY B.TENDER_TYPE_ID,
         A.TENDER_TYPE_DESC

我还建议您习惯使用ANSI连接语法,因为它使连接更清晰,更易于传输(特别是对于外连接)。以下内容应相同:

SELECT B.TENDER_TYPE_ID,
       A.TENDER_TYPE_DESC,
      SUM (B.TENDER_AMT)
FROM POS_TENDER_TYPE_HEAD A
INNER JOIN SA_TRAN_TENDER B
  ON B.TENDER_TYPE_ID = A.TENDER_TYPE_ID
INNER JOIN SA_TRAN_HEAD C
  ON C.TRAN_SEQ_NO = B.TRAN_SEQ_NO
WHERE C.TRAN_DATETIME BETWEEN TO_DATE('01-JAN-2015 00:00:00', 'DD-MON-YYYY HH24:MI:SS')
                          AND TO_DATE('31-MAR-2015 23:59:59', 'DD-MON-YYYY HH24:MI:SS')
GROUP BY B.TENDER_TYPE_ID,
         A.TENDER_TYPE_DESC

这清楚地说明了连接条件是什么,而不是过滤条件。

分享并享受。