2016-11-11 4 views
6

Präfix in der Zelle überprüfen ich SQL lerne, und ich habe eine Tabelle, wo es bestimmte Zellen mit zwei Präfixe wie folgt aus:SQL, wie mit zwei Präfixe

example1(cell) : R:8days; U:5$; 
example2(cell) : R:8days; 
example3(cell) : U:5$; 

ich für diesen U:5$ nach dem ersten überprüfen möchten Präfix, da ich weiß, wie man nach Präfix R:8days; sucht. Also muss ich nach U:5$ suchen und dann eine neue Spalte in der Tabelle erstellen.

sieht Ihr Code wie folgt:

;with cte as (
select 
Employer, AmountPayd, AmountPayd as Payd 
from data 
where TipeOfTransaction like 'Offline Prepaid%' AND Note like '%R:8%' **HERE I WANT TO CHECK FOR PREFIX NR2. 'U:5$' AND MAKE NEW COLUMN FOR WHICH EMPLOYER HAS U:5$ NOTE.** 
) 
select 
Employer, 
    [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) 
    ,[Sum] =ISNULL([4.00],0) + ISNULL([5.00],0) + ISNULL([9.00],0) + ISNULL([10.00],0) + ISNULL([15.00],0) 
    from cte 
    pivot (
    sum(AmountPayd) for Payd in ([4.00],[5.00],[9.00], [10.00], [15.00], [20.00]))pvt; 
+2

Die Technik, die Sie benötigen genannt wird String-Splitting. Es gibt viele Fragen zu [SO, die Ihnen zeigen können, wie Sie dies tun] (http://stackoverflow.com/search?q=sql+string+splitter). Aber ich würde Ihnen empfehlen, stattdessen Ihr Tischdesign zu ändern. Es ist keine gute Idee, mehrere Werte in einer Zelle zu speichern. Es funktioniert gegen die Designprinzipien, die SQL untermauern. Jede Spalte sollte einem bestimmten Zweck gewidmet sein. –

+0

Ich weiß das, aber ich fragte mich nur, ob ich es so machen kann, danke für deine Antwort. – vidooo

+1

Es gibt ein paar verschiedene Möglichkeiten, dies zu erreichen. Aber mein persönlicher Favorit ist die Verwendung einer [Tally-Tabelle] (http://www.sqlservercentral.com/blogs/dwainsql/2014/03/27/tally-tables-in-t-sql/). Diese Blogs sprechen über den Ansatz: [SQL Server Central] (http://www.sqlservercentral.com/articles/Tally+Table/72993/) und [SQL Performance] (https://sqlperformance.com/2012/07/ t-sql-Abfragen/Split-Strings). –

Antwort

0

das?

select 
    Employer, AmountPayd, AmountPayd as Payd, 
    CASE WHEN Note like '%R:8%;%U:5$%' THEN 'U:5' END U5Note 
from data 
where TipeOfTransaction like 'Offline Prepaid%' AND Note like '%R:8%' 
+0

Ja vielleicht etwas wie das, aber ich möchte U5Note in der zweiten Spalte tun und die Spalte mit 5 füllen, wo Arbeitgeber diese Notiz geschrieben hatte – vidooo

+0

Fügen Sie die gewünschte Ausgabe für Beispieldaten zu Ihrer Frage hinzu. –

0

(Ich habe einige Fehler in Spaltennamen korrigiert und Refactoring die Abfrage.)

Ich glaube, Sie suchen etwas wie folgt aus:

WITH CTE AS (
    SELECT 
     Employer, 
     AmountPaid, 
     Paid 
    FROM Data 
    LEFT JOIN (VALUES (4, 5, 9, 10, 15, 20)) V(Paid) 
     ON Note LIKE '%U:' + CAST(Paid AS VARCHAR(10)) + '$;%' 
    WHERE TypeOfTransaction LIKE 'Offline Prepaid%' 
     AND Note LIKE '%R:8%' 
) 
SELECT 
    Employer, 
    ISNULL([4.00], 0) AS [4.00], 
    ISNULL([5.00], 0) AS [5.00], 
    ISNULL([9.00], 0) AS [9.00], 
    ISNULL([10.00], 0) AS [10.00], 
    ISNULL([15.00], 0) AS [15.00], 
    ISNULL([4.00] + [5.00] + [9.00] + [10.00] + [15.00], 0) AS Sum 
FROM CTE 
PIVOT(SUM(AmountPaid) 
    FOR Paid IN ([4.00],[5.00],[9.00], [10.00], [15.00], [20.00])) PVT;