SQL Server组由谁来解决?

SQL Server组由谁来解决?,sql,sql-server,group-by,Sql,Sql Server,Group By,需要查询帮助来整理此“简单”任务;) tbl1 您的查询-> 结果tbl2: Name (Credit–Debit)/2014 (Credit–Debit)/2015 (Credit–Debit)/2016 Diaz 0 700 300 Maya 200 500 0 Jane 700 0

需要查询帮助来整理此“简单”任务;)

tbl1

您的查询->

结果tbl2:

Name (Credit–Debit)/2014 (Credit–Debit)/2015 (Credit–Debit)/2016
Diaz          0              700                   300
Maya        200              500                     0
Jane        700                0                   200
非常感谢!!
D.

您可以使用以下

解释

  • 从日期中提取年份
  • 查找贷方-借方
  • 对201420152016年的金额应用透视
  • 数据设置

    我使用贷记和借记的数据类型作为货币,如果你想在你的案例中使用int

    declare @data table(
        Name nvarchar(50) not null,
        TransDate date not null,
        Credit money not null,
        Debit money not null
    )
    
    insert into @data(Name,TransDate,Credit,Debit)
    values ( 'Diaz','2015-01-01',500,200),
           ( 'Diaz','2015-05-01',500,100),
           ( 'Diaz','2016-01-01',500,200),
           ( 'Maya','2014-01-01',500,300),
           ( 'Maya','2015-04-01',500,300),
           ( 'Maya','2015-11-01',500,200),
           ( 'Jane','2014-02-01',500,200),
           ( 'Jane','2014-03-01',500,100),
           ( 'Jane','2016-08-01',500,200)
    
    质疑

    结果

    Name    Credit-Debit/2014   Credit-Debit/2015   Credit-Debit/2016
    Diaz    0.00    700.00  300.00
    Jane    700.00  0.00    300.00
    Maya    200.00  500.00  0.00
    

    希望这能帮助您

    假设您的已知年数有限,一种方法是使用
    案例
    聚合

    SELECT
      name,
      COALESCE(SUM(CASE
        WHEN YEAR(TransDate) = '2014' THEN credit - debit
      END), 0) AS credit_debit_2014,
      COALESCE(SUM(CASE
        WHEN YEAR(TransDate) = '2015' THEN credit - debit
      END), 0) AS credit_debit_2015,
      COALESCE(SUM(CASE
        WHEN YEAR(TransDate) = '2016' THEN credit - debit
      END), 0) AS credit_debit_2016
    FROM table1
    GROUP BY name
    
    结果:

    +------+-------------------+-------------------+-------------------+
    | name | credit_debit_2014 | credit_debit_2015 | credit_debit_2016 |
    +------+-------------------+-------------------+-------------------+
    | Diaz |                 0 |               700 |               300 |
    | Jane |               700 |                 0 |               200 |
    | Maya |               200 |               500 |                 0 |
    +------+-------------------+-------------------+-------------------+
    

    我喜欢使用条件聚合来解决这些问题。即使给定年份的
    贷方
    借方
    ,以下各项也应有效:

    SELECT name,
           SUM(CASE WHEN YEAR(TransDate) = 2014
                    THEN COALESCE(credit, 0) - COALESCE(debit, 0)
                    ELSE 0
               END) as credit_debit_2014,
           SUM(CASE WHEN YEAR(TransDate) = 2015
                    THEN COALESCE(credit, 0) - COALESCE(debit, 0)
                    ELSE 0
               END) as credit_debit_2015,
           SUM(CASE WHEN YEAR(TransDate) = 2016
                    THEN COALESCE(credit, 0) - COALESCE(debit, 0)
                    ELSE 0
               END) as credit_debit_2016
    FROM table1
    GROUP BY name;
    

    你有多少年了?只有三个,或者还有更多?如果这是一个简单的任务,为什么你不试一下呢self@qotqn还有更多。@Imran Ali Khan您显然错过了“简单”中的引语,我喜欢您的解决方案。只是一个问题:在这种情况下,Coalesce和isnull是可互换的?@Diaz。在这种情况下,它们是非常可互换的。两者有细微的区别,但在这里并不相关。
    +------+-------------------+-------------------+-------------------+
    | name | credit_debit_2014 | credit_debit_2015 | credit_debit_2016 |
    +------+-------------------+-------------------+-------------------+
    | Diaz |                 0 |               700 |               300 |
    | Jane |               700 |                 0 |               200 |
    | Maya |               200 |               500 |                 0 |
    +------+-------------------+-------------------+-------------------+
    
    SELECT name,
           SUM(CASE WHEN YEAR(TransDate) = 2014
                    THEN COALESCE(credit, 0) - COALESCE(debit, 0)
                    ELSE 0
               END) as credit_debit_2014,
           SUM(CASE WHEN YEAR(TransDate) = 2015
                    THEN COALESCE(credit, 0) - COALESCE(debit, 0)
                    ELSE 0
               END) as credit_debit_2015,
           SUM(CASE WHEN YEAR(TransDate) = 2016
                    THEN COALESCE(credit, 0) - COALESCE(debit, 0)
                    ELSE 0
               END) as credit_debit_2016
    FROM table1
    GROUP BY name;