2016-11-13 4 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 $», а затем добавить 5 к этому клиенту, который имеет «U: 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

ok, суммы, которые являются payd, являются статичными, поэтому они могут быть оплачены 4.00 $, 5.00 $, 9.00 $ ... и в этих кулонах суммируются все значения, которые были оплачены суммой, которая совпадает с именем столбца. Например, john payd 2 раза 4 $, тогда у Джона есть 8 $ в 4.00. Сумма в конце представляет собой сумму всех сумм payd. Я просто хочу проверить, есть ли U: 5 $ в примечании, а затем добавить 5 в 5 столбцах от клиента, что в действительности его U5: $. – vidooo

+0

Из сообщения об ошибке видно, что ваши суммы хранятся в столбцах «NVARCHAR». Либо убедитесь, что они хранятся в столбцах типа 'MONEY' или' DECIMAL', либо 'CAST' данные в' MONEY' или 'DECIMAL' в' SUM'. –

ответ

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

Это работает просто отлично, могу я спросить вас, как я могу группировать Payd – vidooo

+0

@vidooo. , , Этот вопрос касается группировки по имени. Если у вас есть другой вопрос, задайте * другой вопрос. Я считаю, что это отвечает на этот вопрос. –

+0

Благодарим за помощь – vidooo

Смежные вопросы