2016-11-13 3 views
0

ich SQL lerne, und ich habe Tabelle, die wie folgt aussieht:SQL nvarchar ist ungültig für sum Operator

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; 

ich, so etwas machen möchten:

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 

ich überprüfen möchten, dass Notizspalte, wenn 'U: 5 $' darin ist und dann eine 5 zu dem Kunden hinzufügen, der 'U: 5 $' in der Notizspalte hat, wenn er nichts hinzufügt.

Mein Code sieht wie folgt aus:

;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

Ihre Ausgabe ist kompliziert. Was passiert nach der Verwendungsspalte? –

+0

ok, die Beträge, die bezahlt werden, sind statisch, so dass es bezahlt werden konnte 4,00 $, 5,00 $, 9,00 $ ... und in diesen Spalten sind alle Werte, die bezahlt wurden die Menge, die die gleiche wie Spalte Name ist. Zum Beispiel zahlt John 2 mal 4 $, dann gibt es 8 $ bei 4,00 von John. Summe am Ende ist die Summe aller bezahlten Beträge. Ich will nur überprüfen, ob es U: 5 $ in Anmerkung gibt und dann 5 in 5 Spalte durch den Kunden hinzufügen, der tatsächlich U5: $ in seiner Anmerkung hatte. – vidooo

+0

Aus der Fehlermeldung sieht es so aus, als ob Ihre Beträge in 'NVARCHAR'-Spalten gespeichert sind. Entweder stellen Sie sicher, dass sie in 'GELD' oder' DECIMAL' Typ Spalten gespeichert sind, oder 'CAST' die Daten zu' GELD' oder 'DEZIMAL' in der' SUMME'. –

Antwort

2

Ich bin nicht sicher, was Ihre volle Leistung darstellt. Aber die ersten drei Spalten sind leicht unter Verwendung von bedingter Aggregation zu erhalten:

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; 

Beachten Sie, dass die Spalten für 5, 10 und 15 eine Art davon aus, dass der Wert in payd ist ein Dezimal/numerischer Typ. Gleichheitsvergleiche auf Floats werden nicht empfohlen.

+0

Das funktioniert gut, kann ich dich fragen, wie könnte ich von Payd – vidooo

+0

@vidooo gruppieren. . . In dieser Frage geht es um die Gruppierung nach 'name'. Wenn Sie eine andere Frage haben, fragen Sie * eine weitere Frage. Ich glaube, das beantwortet hier die Frage. –

+0

Vielen Dank für Ihre Hilfe – vidooo