2016-11-11 8 views
6

jestem uczących SQL i mam tabelę, w której istnieją pewne komórki z dwóch prefiksów tak:SQL jak sprawdzić prefiks w celi z dwóch prefiksów

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

Chcę sprawdzić na tej U:5$ po pierwszym prefiks, ponieważ wiem, jak sprawdzić prefiks R:8days;. Muszę więc sprawdzić pod kątem U:5$, a następnie utworzyć nową kolumnę w tabeli.

Mój kod wygląda następująco:

;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

Technika trzeba nazywa podział łańcucha. Istnieje wiele pytań dotyczących [SO, które mogą pokazać, jak to zrobić] (http://stackoverflow.com/search?q=sql+string+splitter). Ale poleciłbym zamiast tego zmienić projekt stołu. Przechowywanie wielu wartości w jednej komórce jest złym pomysłem. Działa niezgodnie z zasadami projektowania, które stanowią podstawę SQL. Każda kolumna powinna być poświęcona jednemu celowi. –

+0

Wiem o tym, ale zastanawiałem się tylko, czy mogę to zrobić tak, dziękuję za odpowiedź. – vidooo

+1

Istnieje kilka różnych sposobów, aby to osiągnąć. Ale moim ulubionym jest używanie [tabeli] (http://www.sqlservercentral.com/blogs/dwainsql/2014/03/27/tally-tables-in-t-sql/). Te blogi mówią o podejściu: [SQL Server Central] (http://www.sqlservercentral.com/articles/Tally+Table/72993/) i [SQL Performance] (https://sqlperformance.com/2012/07/ t-sql-queries/split-string). –

Odpowiedz

0

to?

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

tak może coś takiego, ale chcę zrobić U5Uwaga w drugiej kolumnie i chcę wypełnić kolumnę 5, gdzie pracodawca miał tę notatkę napisaną – vidooo

+0

Dodaj pożądany wynik dla przykładowych danych dostarczonych do twojego pytania. –

0

(mam poprawione niektóre błędy w nazwach kolumn i refactored zapytanie.)

wierzę, szukasz czegoś takiego:

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;