根据第一列的组进行计数

时间:2019-10-31 20:06:03

标签: sql

我正在使用以下查询来计算每个BAN有多少个Bill_date

select replace(c.usertoken, '-', '') as BAN
       , to_char(to_date(bi.name,'YYYY-MM-DD'),'dd-mm-yy') as Billdate_dmy
       , (replace(c.usertoken, '-', '') ||':'|| to_char(to_date(bi.name,'YYYY-MM-DD'),'dd-mm-yy')) as BAN_Billdate_dmy
       , count(c.usertoken) as Number_Of_Bills
from customer c
     , service s
     , document d
     , bill bi
     , batch ba
     , billrun br
where c.ID = s.CUSTOMER_SERVICE_ID 
and s.ID = d.SERVICE_DOCUMENT_ID 
and bi.ID = d.BILL_DOCUMENT_ID 
and d.BATCH = ba.ID 
and ba.BILLRUN = br.ID 
and br.STATUS = 'APPROVED' 
and c.brand='rogers' 
and d.VERSIONEDCONTENTFOLDER='cbu'
group by c.usertoken, bi.name
order by c.usertoken

上述查询的输出

+-----------+----------+--------------------+--------------+--+-------+
|    BAN    | Bill_date | BAN_Billdate      |        Count |
+-----------+----------+--------------------+--------------+--+-------+
| 100001247 | 25-09-19 | 100001247:25-09-19 |            1 |  |       |
| 100001247 | 25-10-19 | 100001247:25-10-19 |            1 |  |       |
| 100002583 | 15-10-19 | 100002583:15-10-19 |            1 |  |       |
| 100004753 | 25-09-19 | 100004753:25-09-19 |            1 |  |       |
| 100004753 | 25-10-19 | 100004753:25-10-19 |            1 |  |       |
| 100005719 | 25-09-19 | 100005719:25-09-19 |            1 |  |       |
| 100005719 | 25-10-19 | 100005719:25-10-19 |            1 |  |       |
| 100006311 | 06-09-19 | 100006311:06-09-19 |            1 |  |       |
| 100009596 | 25-09-19 | 100009596:25-09-19 |            1 |  |       |
| 100009596 | 25-10-19 | 100009596:25-10-19 |            1 |  |       |
+-----------+----------+--------------------+--------------+--+-------+

但是我期待以下输出

+-----------+----------+--------------------+--------------+--+-------+
|    BAN    | Billdate |   BAN_Billdate |  |          Count |
+-----------+----------+--------------------+--------------+--+-------+
| 100001247 | 25-09-19 | 100001247:25-09-19 |            2 |  |       |
| 100001247 | 25-10-19 | 100001247:25-10-19 |            2 |  |       |
| 100002583 | 15-10-19 | 100002583:15-10-19 |            3 |  |       |
| 100004753 | 25-09-19 | 100004753:25-09-19 |            3 |  |       |
| 100004753 | 25-10-19 | 100004753:25-10-19 |            3 |  |       |
| 100005719 | 25-09-19 | 100005719:25-09-19 |            2 |  |       |
| 100005719 | 25-10-19 | 100005719:25-10-19 |            2 |  |       |
| 100006311 | 06-09-19 | 100006311:06-09-19 |            1 |  |       |
| 100009596 | 25-09-19 | 100009596:25-09-19 |            2 |  |       |
| 100009596 | 25-10-19 | 100009596:25-10-19 |            2 |  |       |
+-----------+----------+--------------------+--------------+--+-------+

请告知我应该在查询中进行哪些更改,以使count列反映期望值。

1 个答案:

答案 0 :(得分:0)

我不想触碰您的查询和过时的join语法。请学习用于连接的JOINON子句的正确SQL语法。

也就是说,您似乎希望窗口函数对计数求和:

select sum(count(*)) over (partition by ban, to_date(bi.name, 'YYYY-MM-DD'))

如果每个组仅获得一行,我不确定聚合是否真的有用。在这种情况下,您可能要删除group by并使用:

select count(*) over (partition by ban, to_date(bi.name, 'YYYY-MM-DD'))