2016-11-13 56 views
0

我学习SQL无效,我有表,看起来像这样:SQL nvarchar的是和运营商

Id Name Payd Note 
1 John 5.00 R:8days;U:5$ 
2 Adam 5.00 R:8days; 
3 John 10.00 R:8days; 
4 John 10.00 R:8days; 
5 Adam 15.00 R:30days; 

我想让这样的事情:

Id Name Usage  5.00 10.00 15.00 Sum 
    1 John 5  5.00 20.00 0  25.00 
    2 Adam   5.00 0  15.00 20.00 

我要检查注意列中是否存在'U:5 $',然后向注释列中具有'U:5 $'的该客户添加5,如果它没有添加任何内容。

我的代码如下所示:

;with cte as (
select Customer, PaydAmount, PaydAmount as Payd, Note as Usage 
from t1 
) 
select 
    Customer, Usage 
    ,[4.00] = ISNULL([4.00],0) 
    ,[5.00] = ISNULL([5.00],0) 
    ,[9.00] = ISNULL([9.00],0) 
    ,[10.00] = ISNULL([10.00],0) 
    ,[15.00] = ISNULL([15.00],0) 
    ,[18.00] = ISNULL([18.00],0) 
    ,[20.00] = ISNULL([20.00],0) 
    ,[25.00] = ISNULL([25.00],0) 
    ,[50.00] = ISNULL([50.00],0) 
    ,[Payd] =ISNULL([4.00],0) + ISNULL([5.00],0) + ISNULL([9.00],0) + ISNULL([10.00],0) + ISNULL([15.00],0) + ISNULL([18.00],0) + ISNULL([20.00],0) + ISNULL([25.00],0) + ISNULL([50.00],0) 
    from cte 
    pivot (
     sum(PaydAmount) for Payd in ([4.00],[5.00],[9.00], [10.00], [15.00],[18.00], [20.00], [25.00], [50.00]))pvt 
     order by Customer; 
+0

您的输出很复杂。使用列后会发生什么? –

+0

好吧,支付的金额是静态的,所以它可以支付4.00 $,5.00 $,9.00 $ ...,并在这些coulumns中总结了所有支付的金额与列名相同的金额。例如约翰支付2次4美元,那么约翰在4.00列就有8美元。最后的总和是所有支付金额的总和。我只是想检查是否有U:5 $的记录,然后在客户的5列中添加5,他的笔记里有U5:$。 – vidooo

+0

从错误消息看来,您的金额存储在“NVARCHAR”列中。要么确保它们存储在'MONEY'或'DECIMAL'类列中,或者'CAST'将数据存储到'SUM'中的'MONEY'或'DECIMAL'。 –

回答

2

我不知道你的全输出代表什么。但前三列易于使用条件聚合得到:

select row_number() over (order by (select null)) as id, 
     name, 
     max(case when note like '%U:5$' then 5 end) as usage, 
     sum(case when payd = 5.00 then payd else 0 end) as [5.00], 
     sum(case when payd = 10.00 then payd else 0 end) as [10.00], 
     sum(case when payd = 15.00 then payd else 0 end) as [15.00], 
     sum(payd) as total 
from cte 
group by name; 

注意,5,10,15排序的列假设在payd的值是一个小数/数字类型。不建议使用浮点数进行平等比较。

+0

这工作得很好,我可以问你,我怎么能通过付款 – vidooo

+0

@vidooo分组。 。 。这个问题是关于用'name'分组的。如果你有另一个问题,然后问*另一个问题。我相信这回答了这个问题。 –

+0

谢谢你的帮助 – vidooo