如何显示Oracle

时间:2015-08-19 10:15:35

标签: sql oracle group-by sum

我的查询应显示所有单个日期的销售总额,而不是每天的单独销售额。下面是我试过的查询,我附上了我从这个查询得到的输出的示例图像。感谢您的帮助。

sample

SELECT sc_cd,Mon,sum(NET_SAL) SALE
  FROM (SELECT TO_CHAR(to_date(deli_DT),'Mm') mm,
               sc_cd,
               TO_CHAR(to_date(deli_DT),'dd-Mon-yy') Mon,
               sum(sale_net) NET_SAL
          from bill_mas
         where sc_cd not in ('22')
           AND deli_dt BETWEEN '01-aug-15' and '31-aug-15'
           AND CANCL IS NULL
           AND sc_cd='01'
         GROUP BY TO_CHAR(to_date(deli_DT),'Mm'),
                  SC_cd,
                  TO_CHAR(to_date(deli_DT),'dd-Mon-yy'),
                  sale_net)
ORDER BY 3;

3 个答案:

答案 0 :(得分:3)

sale_net子句中有group_by列,因此每个值仍会看到一行 - 如果您有两个源行,则只会看到任何实际聚合相同的价值。从组中删除它。它也不清楚你为什么要使用子查询;如果您不想在输出中MM,请不要在第一时间选择它:

SELECT sc_cd,TO_CHAR(deli_DT,'dd-Mon-yy') Mon,sum(sale_net) NET_SAL
from bill_mas
where sc_cd not in('22')
and deli_dt BETWEEN '01-aug-15' and '31-aug-15'
and CANCL IS NULL
AND sc_cd='01'
GROUP BY SC_cd,TO_CHAR(deli_DT,'dd-Mon-yy')
order by 3

您应该按trunc(deli_DT)选择和分组,而不是TO_CHAR(to_date(deli_DT),'dd-Mon-yy'),但如果您需要格式化它,那么它可能无关紧要。但是,如果deli_DT是一个日期字段 - 虽然它似乎并不完全清楚 - 那么你根本就不应该对其进行to_date(),就像Boneist评论的那样。您使用NLS_DATE_FORMAT进行了两次隐式转换,您真正在做to_date(to_char(deli_dt))

使用字符串作为过滤器并不是一个好主意,也不是使用两位数的年份;而且你不会看到任何来自2015-08-31但是在午夜之后的行;您应该使用明确的日期转换或文字,并使用大于/小于而不是:

and deli_dt >= to_date('01-aug-2015', 'DD-mon-YYYY')
and deli_dt < to_date('01-sep-2015', 'DD-mon-YYYY'

或者:

and deli_dt >= date '2015-08-01'
and deli_dt < date '2015-09-01'

答案 1 :(得分:2)

问题很简单,您必须从sale_net子句中删除group by列。

另外,如果deli_DT是Date数据类型,则应该编写不带to_date函数的查询。此外,您不需要两个group by子句:

SELECT 
  TO_CHAR(deli_DT,'Mm') mm,
  sc_cd,
  TO_CHAR(deli_DT,'dd-Mon-yy') Mon,
  sum(sale_net) NET_SAL 
from bill_mas
where sc_cd not in('22')
and deli_dt BETWEEN '01-aug-15' and '31-aug-15'
and CANCL IS NULL
AND sc_cd='01'
GROUP BY TO_CHAR(deli_DT,'Mm'), sc_cd,  TO_CHAR(deli_DT,'dd-Mon-yy')
order by 3;

答案 2 :(得分:1)

如果你正在使用oracle并希望白天销售,你可以使用分析函数,如 -

sum(net_sale) over(partition by mon) from your_table;

它会给你每天的销售,比如我疯了这样的temp1表 -

id   mon        net_sale
1   05-08-15    123
1   05-08-15    23
1   05-08-15    1
1   12-08-15    23
1   12-08-15    455
1   12-08-15    122

,输出就像 -

Mon            net_sale
05-08-15         147
05-08-15         147
05-08-15         147
12-08-15         600
12-08-15         600
12-08-15         600