Sql server 2008 r2 将SQL Server数据从多个日期列格式化为单个日期列
我在数据库中有一些关于不同客户付款的数据。客户支付的款项中,很少有是通过的,也很少没有失败。SQL Server 2008 R2中的示例数据如下所示:Sql server 2008 r2 将SQL Server数据从多个日期列格式化为单个日期列,sql-server-2008-r2,Sql Server 2008 R2,我在数据库中有一些关于不同客户付款的数据。客户支付的款项中,很少有是通过的,也很少没有失败。SQL Server 2008 R2中的示例数据如下所示: +-----------+------------+-------------+--------+--------+ | Name | Inst Date | Status Date | Status | Amount | +-----------+------------+-------------+--------+-------
+-----------+------------+-------------+--------+--------+
| Name | Inst Date | Status Date | Status | Amount |
+-----------+------------+-------------+--------+--------+
| Jonathan | 2014-12-03 | 2014-12-05 | PASS | 25000 |
| Samantha | 2014-12-08 | 2014-12-11 | FAIL | 105000 |
| David | 2014-12-11 | 2014-12-11 | PASS | 2500 |
| Samantha | 2014-12-11 | 2014-12-15 | PASS | 50000 |
| Jonathan | 2014-12-15 | 2014-12-05 | PROC | 5000 |
+-----------+------------+-------------+--------+--------+
187500
管理层希望此数据的格式如下所示
+-----------+------------+---------+--------+--------+
| Name | Date | ALL | PASS | FAIL |
+-----------+------------+---------+--------+--------+
| Jonathan | 2014-12-03 | 25000 | 0 | 0 |
| Jonathan | 2014-12-05 | 0 | 25000 | 0 |
| Samantha | 2014-12-08 | 105000 | 0 | 0 |
| Samantha | 2014-12-11 | 0 | 0 | 105000 |
| Samantha | 2014-12-11 | 50000 | 0 | 0 |
| David | 2014-12-11 | 2500 | 2500 | 0 |
| Samantha | 2014-12-15 | 0 | 50000 | 0 |
| Jonathan | 2014-12-15 | 5000 | 0 | 0 |
+-----------+------------+---------+--------+--------+
187500 77500 105000
使用嵌套游标,一个用于名称,另一个用于日期,通过从每个循环下的源表获取数据并从存储过程返回数据,我构建了一个临时表。所有这些都运转良好,但当一年的数据太多时,速度会非常缓慢
有关于如何优化的建议吗?您可以使用一个联合体进行优化
select name, [inst date] as date, amount as all, 0 as pass, 0 as fail
from payments
union
select name, [Status date] as date, 0 as all, case when Status = 'PASS' then amount else 0 end as pass, case when Status = 'FAIL' then amount else 0 end as fail
from payments
我不明白,为什么每个客户都有多条线路?为什么不这样做呢:
SELECT t.Name, t.Date, SUM(t.ALL) AS ALL, SUM(t.PASS) AS PASS, SUM(t.FAIL) AS FAIL
FROM
(
SELECT
Name,
,CASE WHEN Status IN ('PASS', 'FAIL') THEN [Inst Date] ELSE [Status Date] END AS Date
-- OR SIMPLY one of the dates..
,Amount AS ALL
,CASE WHEN Status = 'PASS' THEN Amount ELSE 0 END AS PASS
,CASE WHEN Status = 'FAIL' THEN Amount ELSE 0 END AS FAIL
FROM YourTable
) t
GROUP BY t.Name, t.Date
你需要一个GROUP BY after,否则David line将不起作用。例如Yes@MiguelRoxo,我添加了GROUP BY,效果很好。这同样有效,但我需要再次添加额外的GROUP BY,以避免每种类型出现单独的日期。