SQL Server组由谁来解决?
需要查询帮助来整理此“简单”任务;) tbl1 您的查询-> 结果tbl2: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
Name (Credit–Debit)/2014 (Credit–Debit)/2015 (Credit–Debit)/2016
Diaz 0 700 300
Maya 200 500 0
Jane 700 0 200
非常感谢!!
D.您可以使用以下 解释
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;