如何获取总行数和特定列的总和

时间:2019-02-12 15:12:11

标签: sql sql-server tsql

这是我的原始查询

SELECT acct_id,
       acct_client_short_name,
       acct_cat_code,
       cusip_num,
       symbol_code,
       product_name,
       sec_type_code,
       acct_type_code,
       ann_int_rate_and_maturity_dt_text,
       sd_id,
       loc_code,
       settled_flag,
       td_id,
       eff_dt,
       clearing_code,
       SUM(traded_shrs_num),
       SUM(curr_shrs_num) AS c1
FROM (SELECT 'ID900910' AS acct_id,
             'CNS Netting' AS acct_client_short_name,
             'CNS' AS acct_cat_code,
             cusip_num,
             symbol_code,
             product_name,
             sec_type_code,
             acct_type_code,
             ann_int_rate_and_maturity_dt_text,
             sd_id,
             loc_code,
             settled_flag,
             td_id,
             eff_dt,
             clearing_code,
             traded_shrs_num,
             curr_shrs_num
      FROM [csr_staging].[dbo].[fi_impact_source]
      WHERE (clearing_code = 'MBS'
          OR clearing_code = 'CNS')
        AND (SD_ID >= EFF_DT)) a
GROUP BY acct_id,
         acct_client_short_name,
         acct_cat_code,
         cusip_num,
         symbol_code,
         product_name,
         sec_type_code,
         acct_type_code,
         ann_int_rate_and_maturity_dt_text,
         sd_id,
         loc_code,
         settled_flag,
         td_id,
         eff_dt,
         clearing_code;

总行数= 383行

如何从上述查询中获取总行数?

select count(*),sum(c1) from query1

2 个答案:

答案 0 :(得分:1)

您应该这样写:

SELECT count(*), sum(c1) FROM (SELECT ...) x

换句话说:

SELECT count(*), sum(c1)
FROM (
SELECT acct_id,
       acct_client_short_name,
       acct_cat_code,
       cusip_num,
       symbol_code,
       product_name,
       sec_type_code,
       acct_type_code,
       ann_int_rate_and_maturity_dt_text,
       sd_id,
       loc_code,
       settled_flag,
       td_id,
       eff_dt,
       clearing_code,
       SUM(traded_shrs_num) AS c2,
       SUM(curr_shrs_num) AS c1
FROM (SELECT 'ID900910' AS acct_id,
             'CNS Netting' AS acct_client_short_name,
             'CNS' AS acct_cat_code,
             cusip_num,
             symbol_code,
             product_name,
             sec_type_code,
             acct_type_code,
             ann_int_rate_and_maturity_dt_text,
             sd_id,
             loc_code,
             settled_flag,
             td_id,
             eff_dt,
             clearing_code,
             traded_shrs_num,
             curr_shrs_num
      FROM [csr_staging].[dbo].[fi_impact_source]
      WHERE (clearing_code = 'MBS'
          OR clearing_code = 'CNS')
        AND (SD_ID >= EFF_DT)) a
GROUP BY acct_id,
         acct_client_short_name,
         acct_cat_code,
         cusip_num,
         symbol_code,
         product_name,
         sec_type_code,
         acct_type_code,
         ann_int_rate_and_maturity_dt_text,
         sd_id,
         loc_code,
         settled_flag,
         td_id,
         eff_dt,
         clearing_code
) x

这被称为“派生表”。

答案 1 :(得分:0)

尝试以下代码。但是,由于其他值按列分组,因此该代码将为您提供所有行中重复的记录总数。

;WITH CTE
AS
(
   SELECT 'ID900910' AS acct_id,
             'CNS Netting' AS acct_client_short_name,
             'CNS' AS acct_cat_code,
             cusip_num,
             symbol_code,
             product_name,
             sec_type_code,
             acct_type_code,
             ann_int_rate_and_maturity_dt_text,
             sd_id,
             loc_code,
             settled_flag,
             td_id,
             eff_dt,
             clearing_code,
             traded_shrs_num,
             curr_shrs_num
   FROM [csr_staging].[dbo].[fi_impact_source]
   WHERE (clearing_code = 'MBS'OR clearing_code = 'CNS'
         )
         AND (SD_ID >= EFF_DT)
)
SELECT acct_id,
       acct_client_short_name,
       acct_cat_code,
       cusip_num,
       symbol_code,
       product_name,
       sec_type_code,
       acct_type_code,
       ann_int_rate_and_maturity_dt_text,
       sd_id,
       loc_code,
       settled_flag,
       td_id,
       eff_dt,
       clearing_code,
       SUM(traded_shrs_num),
       SUM(curr_shrs_num) AS c1,
       (SELECT COUNT(*) FROM CTE) AS [RecordCount]
FROM CTE
      GROUP BY acct_id,
               acct_client_short_name,
               acct_cat_code,
               cusip_num,
               symbol_code,
               product_name,
               sec_type_code,
               acct_type_code,
               ann_int_rate_and_maturity_dt_text,
               sd_id,
               loc_code,
               settled_flag,
               td_id,
               eff_dt,
               clearing_code
      ;