【问题标题】:Group By in SQL Server , filtering result only referring to one fieldSQL Server中的Group By,过滤结果只针对一个字段
【发布时间】:2014-06-11 06:38:10
【问题描述】:

我有以下查询:

SELECT st.np_trxn_dt           AS transactiondate,
       st.trxn_dt,
       (
           SELECT ISNULL(st.cheque_no, '-') + '-' + ISNULL(st.bank_name, '-') + 
                  '-' + ISNULL(st.voucher_no, '-') + '-' + ISNULL(st.trxn_by, '-')
       )                       AS OldDescription,
       ISNULL(
           (
               SELECT dbo.bank_statement_remarks(
                          st.bank_name,
                          st.trxn_by,
                          st.sav_amt,
                          st.wthdrl_amt,
                          ISNULL(
                              (
                                  SELECT NAME
                                  FROM   mem_group_mcg
                                  WHERE  group_id = sa.center_id
                              ),
                              ''
                          )
                      )
           ),
           ''
       )                       AS DESCRIPTION,
       (st.sav_amt)            AS Saving,
       st.wthdrl_amt           AS Withdrawl,
       ISNULL(st.remarks, '')  AS remarks,
       st.trxn_dt
FROM   dbo.sav_transaction     AS st
       INNER JOIN (
                SELECT DISTINCT acc_no,
                       center_id,
                       group_id
                FROM   sav_acc_mcg
                WHERE  scheme_id = '100'
                GROUP BY
                       acc_no,
                       center_id,
                       group_id
            ) sa
            ON  st.acc_no = sa.acc_no
WHERE  (st.trxn_dt BETWEEN '2013-07-17' AND '2014-01-22')
       AND st.acc_no = '100-002703'
ORDER BY
       st.trxn_dt

结果:

但我只需要按 trxn_dt/transactiondate 过滤/分组,如果我添加 GROUP BY 子句,则所有字段都需要添加到没有给出预期结果的子句中。我需要根据 trxn_dt 的总金额。每个交易类型我需要一个 trxn_dt 一行,即存款或取款。如果在同一日期有 3 笔存款交易,那么我需要为交易求和一行,如果在同一日期有 2 笔取款交易,那么我需要一个汇总行来进行交易。 换句话说,我需要单独的存款和取款行,但结果应该是总和。

【问题讨论】:

  • 在您的查询中使用 SUM(Deposit)SUM(Withdraw)
  • 如果我使用SUM,则应该添加GROUP BY子句,这不是必需的。
  • 对于每一列,您想要组合的行中的所有值都相同(在这种情况下,将它们添加到 GROUP BY 子句应该不是问题)或者值不同,在在这种情况下,您需要指出应该使用哪个聚合函数(例如MIN() 或与金额一样,SUM())将这些多个值组合成一个 single 输出值。有什么问题?
  • 在几乎所有情况下。金额和日期只会有所不同,但其他字段的值相同。

标签: sql sql-server


【解决方案1】:

您是要过滤还是要分组?仅当您使用聚合函数(我在您发布的查询中没有看到)时,分组才有意义。如果您希望根据交易日期对结果求和,那么您无论如何都无法在一行中容纳其他信息,例如支票号码等,因为会有多张支票。

【讨论】:

  • 我只想过滤。
  • 可以在查询中添加任何内容以获得所需的结果吗??
【解决方案2】:

这样试试

SUM(Deposit) OVER(partition by transactiondate) as totaldeposit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多