2016-11-11 74 views
6

我學習SQL和我有哪裏有一定的細胞與兩個前綴像這樣的表:SQL如何檢查細胞前綴的兩個前綴

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

我想後先檢查該U:5$前綴,因爲我知道如何檢查前綴R:8days;。所以我需要檢查U:5$,然後在表中創建一個新列。

我的代碼如下所示:

;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

您所需要的技術被稱爲字符串拆分。有很多問題[可以告訴你如何做到這一點](http://stackoverflow.com/search?q=sql+string+splitter)。但我會建議你改變你的餐桌設計。將多個值存儲在一個單元格中是一個壞主意。它違背了支持SQL的設計原則。每一欄應專注於一個目的。 –

+0

我知道,但我只想知道我是否可以這樣做,謝謝你的回答。 – vidooo

+1

有幾種不同的方法來實現這一點。但我個人最喜歡的是使用[理貨表](http://www.sqlservercentral.com/blogs/dwainsql/2014/03/27/tally-tables-in-t-sql/)。這些博客討論了這種方法:[SQL Server Central](http://www.sqlservercentral.com/articles/Tally+Table/72993/)和[SQL性能](https://sqlperformance.com/2012/07/ T-SQL查詢/分割字符串)。 –

回答

0

這?

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

是的,也許這樣的事情,但我想在第二欄做U5Note,並想填寫5欄,其中僱主有寫該筆記 – vidooo

+0

爲提供給您的問題的樣本數據添加所需的輸出。 –

0

(我已經糾正了在列名的一些錯誤和重構查詢。)

我相信,你正在尋找的東西是這樣的:

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;