Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 r2 将SQL Server数据从多个日期列格式化为单个日期列_Sql Server 2008 R2 - Fatal编程技术网

Sql server 2008 r2 将SQL Server数据从多个日期列格式化为单个日期列

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 | +-----------+------------+-------------+--------+-------

我在数据库中有一些关于不同客户付款的数据。客户支付的款项中,很少有是通过的,也很少没有失败。SQL Server 2008 R2中的示例数据如下所示:

+-----------+------------+-------------+--------+--------+
|   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,以避免每种类型出现单独的日期。