我正在使用SQL Server 2008R2。我有以下表格的配置文件名称和T1作为列名称,我需要根据某些条件添加另外两列t2和t3
Profile Name T1 T2 T3
----------------------------------
IP Singles 0
IP Singles 90
IP Singles 100
Disputes 180
IP Multis 145
Performance 378
IP Color 420
Disputes 170
IP Multis 104
Insurance 340
Insurance 120
Insurance 1335
T2和T3列的条件如下:
对于T2:
When T1 < 900 And
Current row of Profile Name <> Previuos row of Profil Name then output of T2 will be same as T1 Else it will be 0.
对于T3:
When T1 <= 900 And Current row of Profile Name = Previous row of Profile Name then output of T3 will be same as T1 Else it will be 0.
例如:
如果T1大于900并且ProfileName的当前行不等于ProfileName的上一行,则T2的值将为T1 Else 0.
同样,如果T1大于或等于900并且ProfileName的当前行等于ProfileName的上一行,则T3的值将为T1 Else 0.
我的预期产量低于:
Profile Name T1 T2 T3
--------------------------------
IP Singles 0 0 0
IP Singles 90 0 90
IP Singles 100 0 100
Disputes 180 180 0
IP Multis 145 145 0
Performance 378 378 0
IP Color 420 420 0
Disputes 170 170 0
IP Multis 104 104 0
Insurance 340 340 0
Insurance 120 0 120
Insurance 1335 0 0
我希望我清楚这个问题,请帮助我用SELECT
查询来实现该输出。
答案 0 :(得分:3)
这可以在ROW_NUMBER()和CTE:
的帮助下完成;WITH cte AS (
SELECT [Profile Name],
T1,
ROW_NUMBER() OVER (ORDER BY (SELECT 1)) as RN
FROM YourTable
)
SELECT c1.[Profile Name],
c1.T1,
CASE WHEN c1.T1 < 900 AND c1.[Profile Name] != c2.[Profile Name] THEN c1.T1 ELSE 0 END as T2,
CASE WHEN c1.T1 <= 900 AND c1.[Profile Name] = c2.[Profile Name] THEN c1.T1 ELSE 0 END as T3
FROM cte c1
LEFT JOIN cte c2
ON c1.RN = c2.RN +1
输出:
Profile Name T1 T2 T3
IP Singles 0 0 0
IP Singles 90 0 90
IP Singles 100 0 100
Disputes 180 180 0
IP Multis 145 145 0
Performance 378 378 0
IP Color 420 420 0
Disputes 170 170 0
IP Multis 104 104 0
Insurance 340 340 0
Insurance 120 0 120
Insurance 1335 0 0
答案 1 :(得分:1)
在较新版本的SQL Server中,您可以使用LAG函数来访问上一行中的数据。在SQL Server 2008中,尚不支持此功能。
解决方法是使用自连接,其中连接条件为:链接副本1的行n,副本2的第n + 1行。
但是,在这两种情况下,你需要一些方法来指定表的顺序:表不是排序列表,所以为了以某种顺序运行它你需要一个额外的列(你没有&# 39; t提到)带有序列号或某些排序条件(例如ORDER BY&#34; Profile Name&#34;,T1),这些当前不是您的订单。
- 彼得·范罗罗斯·ABIS培训&amp;咨询。