SQL对特定结果使用计数或总和

SQL对特定结果使用计数或总和,sql,postgresql,Sql,Postgresql,我试图通过本机SQL查询获得结果,如下图所示,目前我不确定是否有任何方法仅使用SQL获得此结果 我对这个问题很感兴趣,但目前还不清楚: SELECT receipts.client_code clientCode, date_trunc('MON', receipts.create_date) monthYear, COUNT(date_trunc('MON', receipts.create_date)) receipts, subReceipts.tot

我试图通过本机SQL查询获得结果,如下图所示,目前我不确定是否有任何方法仅使用SQL获得此结果

我对这个问题很感兴趣,但目前还不清楚:

 SELECT 
    receipts.client_code clientCode, 
    date_trunc('MON', receipts.create_date) monthYear,
    COUNT(date_trunc('MON', receipts.create_date)) receipts,
    subReceipts.total total
    FROM receipts
    LEFT JOIN (SELECT 
      receipts.client_code clientCode, 
      date_trunc('MON', receipts.create_date) monthYear,
      COUNT(date_trunc('MON', receipts.create_date)) total
      FROM receipts

      GROUP BY 
      receipts.client_code,
      date_trunc('MON' ,receipts.create_date)
      ORDER BY 
      date_trunc('MON' ,receipts.create_date)  
     ) subReceipts ON subReceipts.clientCode = receipts.client_code
   GROUP BY 
    receipts.client_code,
    date_trunc('MON' ,receipts.create_date),
    subReceipts.total 
   ORDER BY 
    date_trunc('MON' ,receipts.create_date)  
sql数据和db表创建脚本示例:

CREATE TABLE receipts 
(
receipt_id int primary key,
client_code varchar not null,
create_date date not null
);

insert into receipts (receipt_id, client_code, create_date) values (1, 'fx90', to_date('2016/01/11', 'yyyy/MM/dd'));
insert into receipts (receipt_id, client_code, create_date) values (2, 'fx90', to_date('2016/02/12', 'yyyy/MM/dd'));
insert into receipts (receipt_id, client_code, create_date) values (3, 'fx90', to_date('2016/02/20', 'yyyy/MM/dd'));
insert into receipts (receipt_id, client_code, create_date) values (4, 'fx90', to_date('2016/03/11', 'yyyy/MM/dd'));
insert into receipts (receipt_id, client_code, create_date) values (5, 'fx90', to_date('2016/03/12', 'yyyy/MM/dd'));
insert into receipts (receipt_id, client_code, create_date) values (6, 'fx90', to_date('2016/03/19', 'yyyy/MM/dd'));
示例结果


假设使用mysql,您只需执行以下操作:

set @running_total := 0;
SELECT
    client_code, 
    CONCAT(MONTH(create_date), ' - ', YEAR(create_date)) as month_year,
    COUNT(receipt_id) AS receipts_month,
    (@running_total := @running_total + COUNT(receipt_id)) as total_receipts
FROM receipts
GROUP BY client_code, MONTH(create_date), YEAR(create_date)
ORDER BY receipt_id;

假设使用mysql,您可以执行以下操作:

set @running_total := 0;
SELECT
    client_code, 
    CONCAT(MONTH(create_date), ' - ', YEAR(create_date)) as month_year,
    COUNT(receipt_id) AS receipts_month,
    (@running_total := @running_total + COUNT(receipt_id)) as total_receipts
FROM receipts
GROUP BY client_code, MONTH(create_date), YEAR(create_date)
ORDER BY receipt_id;
对于postgresql:

SELECT clientCode, monthYear, receipts,
       sum(receipts) over(order by monthYear) as total
  FROM (
     SELECT receipts.client_code clientCode, 
            date_trunc('MON', receipts.create_date) monthYear,
            COUNT(1) receipts
       FROM receipts
      GROUP BY receipts.client_code, monthYear
  ) X
 ORDER BY monthYear
对于postgresql:

SELECT clientCode, monthYear, receipts,
       sum(receipts) over(order by monthYear) as total
  FROM (
     SELECT receipts.client_code clientCode, 
            date_trunc('MON', receipts.create_date) monthYear,
            COUNT(1) receipts
       FROM receipts
      GROUP BY receipts.client_code, monthYear
  ) X
 ORDER BY monthYear

看起来您希望向每行添加“运行总计”
DATE\u TRUNC
不是一个有效的MySQL函数,因此不清楚为什么要用MySQL标记这个问题。true-MySQL tag removed看起来您想在每一行中添加一个“running total”
DATE\u TRUNC
不是一个有效的MySQL函数,所以不清楚为什么这个问题会用MySQL标记。true-MySQL标记已删除这就是我要找的-你能告诉我“count(1)”的用法吗?它只显示为供分组使用吗?@PDave
count()
计算任何非空值<代码>1不为空:)
计数(1)
等于计数(date\u trunc('MON',receipts.create\u date)),但可能更快。这是我要找的吗?你能告诉我“count(1)”使用了什么吗?它显示为仅供分组使用吗?@PDave
count()
计数任何非空值<代码>1不为空:)
计数(1)
等于计数(date\u trunc('MON',receipts.create\u date)),但可能更快