【问题标题】:SQL Query to find deference between sum of two fields in different tableSQL查询以查找不同表中两个字段之和之间的差异
【发布时间】:2018-06-05 09:08:10
【问题描述】:

我有 3 张桌子,如下所示。我想找到平衡

Table A
studentID       Name
1               Bob
2               Sam
3              Sara

Table B
id  studentID   Credit
1   1       100
2   1       150
3   2       150
4   2       150
5   3       100
6   3       200

Table C
id  studentID   Amount      Type
1   1             50        cash
2   1            120        card
3   2            100        cash
4   2            130        card
5   3            50         card
6   3            150        card

我想得到如下结果表,其中 Balance = Sum(credit) - sum(amount) where type = card。

结果表

studentID       Name    Credit  Amount  Balance
1               Bob     250      120    130
2               Sam     300      130    170
3               Sara    300      200    100

编辑
根据他的评论,这是他尝试过的查询

select A.studentID,
       A.Name,
       ISNULL(SUM(B.Credit),0) as [Credit], 
       ISNULL(SUM(C.Amount),0) as [Amount], 
       ISNULL(SUM(B.Credit),0) - (select ISNULL(SUM(C.Amount),0) from C Group by C.studentID having C.Type='card' and C.studentID=A.studentID) as [balance] 
from A 
  left outer join B on A.studentID = B.studentID 
  left outer join C on B.studentID = C.studentID 
group by A.studentID 

【问题讨论】:

  • 我不明白你用来达到预期输出的数学。但除此之外,你有没有尝试过?
  • type列的作用是什么?
  • 这是我尝试过的。但它不起作用选择 A.studentID,A.Name,ISNULL(SUM(B.Credit),0) 作为 [Credit],ISNULL(SUM(C.Amount),0) 作为 [Amount],ISNULL( SUM(B.Credit),0) - (select ISNULL(SUM(C.Amount),0) from C Group by C.studentID with C.Type='card' and C.studentID=A.studentID) as [balance ] from A left outer join B on A.studentID = B.studentID left outer join C on B.studentID = C.studentID group by A.studentID
  • 类型为支付方式。如果他用现金支付,则不应从信用中扣除
  • 请将您尝试过的查询添加到您的问题中,而不仅仅是将其作为评论放在此处。我现在已经为您完成了,但请在将来这样做

标签: sql-server group-by aggregate-functions


【解决方案1】:

处理没有学分/金额的学生:

SELECT  A.STUDENTID, A.[NAME]
    , sum(B.CREDIT) AS [CREDIT]
    , sum(C.AMOUNT) AS [AMOUNT]
    , sum(B.CREDIT) - sum(C1.AMOUNT) AS [BALANCE]
FROM @TABLEA A
INNER JOIN (SELECT A.STUDENTID, isnull(SUM(B.CREDIT), 0) AS CREDIT FROM @TABLEA A LEFT JOIN @TABLEB B ON A.STUDENTID = B.STUDENTID GROUP BY A.STUDENTID) B ON A.STUDENTID = B.STUDENTID
INNER JOIN (SELECT A.STUDENTID, isnull(SUM(C.AMOUNT), 0) AS AMOUNT FROM @TABLEA A LEFT JOIN @TABLEC C ON A.STUDENTID = C.STUDENTID WHERE [TYPE] = 'CARD' GROUP BY A.STUDENTID) C ON B.STUDENTID = C.STUDENTID
INNER JOIN (SELECT A.STUDENTID, isnull(SUM(C.AMOUNT), 0) AS AMOUNT FROM @TABLEA A LEFT JOIN @TABLEC C ON A.STUDENTID = C.STUDENTID WHERE [TYPE] = 'CARD' GROUP BY A.STUDENTID) C1 ON B.STUDENTID = C1.STUDENTID
group by  A.STUDENTID, A.[NAME]

【讨论】:

    【解决方案2】:

    这应该可以正常工作

    SELECT
    a.studentid,
    a.Name,
    sum(b.Credit) AS Credit,
    ISNULL(c.Amount,0) AS Amount,
    sum(b.Credit) - ISNULL(c.Amount,0) AS Balance
    FROM  a
    INNER JOIN  b ON a.studentid = b.StudentID
    LEFT JOIN (select sum(amount) amount,studentid from c where type='card' 
    group by studentid) as c ON a.studentid = c.studentid
    GROUP BY a.studentid, a.Name,c.Amount
    

    SQL Fiddle Link

    【讨论】:

      【解决方案3】:

      我没试过。请告诉我。

      SELECT A.studentID,A.Name,B.Credit,C.Amount,(Credit-Balance) as Amount from A, B, C where A.studentID=B.studentID=C.studentID AND B.id=C.id AND C.type="card";
      

      【讨论】:

      • 这将排除任何没有“卡片”条目的学生 ID,这可能不是他想要的。
      • 他提到他只想要类型为卡片的结果
      • 我猜可以双向阅读。此外,您用于连接的 WHERE 语句不符合 T-SQL。
      【解决方案4】:

      这应该可以。它假设 A 中的所有学生都在 B 中。左连接迎合了并非所有人都可能有“卡”金额的事实,如果他们没有,则返回 0(否则减去 NULL 的学分将返回 @987654322 @余额)。

         SELECT
          a.StudentID,
          a.Name,
          sum(b.Credit) AS Credit,
          ISNULL(sum(c.Amount),0) AS Amount,
          sum(b.Credit) - ISNULL(sum(c.Amount),0) AS Balance
          FROM tableA as a
          INNER JOIN tableB as b ON a.StudentID = b.StudentID
          LEFT JOIN tableC as c ON a.StudientID = c.StudentID AND c.[Type] = 'card'
          GROUP BY a.StudentID, a.Name
      

      【讨论】:

        【解决方案5】:

        这将是我的起点。确定正确的计算。 那我就开始重构。

         SELECT a.*, 
           (SELECT SUM(b.credit) FROM TableB b WHERE a.studentID = b.studentID) as Credit,
           (SELECT SUM(c.amount) FROM TableC c WHERE a.studentID = c.studentID) as Amount,
           ((SELECT SUM(b.credit) FROM TableB b WHERE a.studentID = b.studentID)
            - 
           (SELECT SUM(c.amount) FROM TableC c WHERE a.studentID = c.studentID)) as Balance
          FROM TableA a;
        

        我做了一个sqlFiddle:http://sqlfiddle.com/#!9/b86dc/7

        【讨论】:

          【解决方案6】:

          您可以尝试如下查询

          See live demo

          select A.*, credit, amount, balance= coalesce(credit,0) - coalesce(amount,0) from
          [table A] A
          left join
          (
          select 
              studentid,
              credit= sum(credit)
          from [table b] b 
          group by studentid
          )B
              on A.studentID= B.studentID
          left join
          (
          select 
              studentid,
              amount= sum(amount)
          from [table C] 
          group by studentid
          )C
          on A.studentID=C.studentID
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-01-05
            • 2015-03-19
            • 2016-07-20
            • 2021-01-02
            • 1970-01-01
            • 1970-01-01
            • 2012-02-09
            相关资源
            最近更新 更多