SQL - 减法行
SQL - subtraction row
我有以下查询
SELECT VALUE
,Source1
,Source2
,DocNo
FROM myTable
它returns以下数据:
我想根据以下条件计算减法:
for DocNo A1
if(Source1=1 and Source2=0) VALUE 34
if(Source1=1 and Source2=0) VALUE 21
subtraction two row 34 - 21 = 13
有什么想法吗?
预期结果:
如果我对你的问题理解正确,下面的查询就是你想要的:
SELECT Value, Score1, Score2, DocNo
FROM TestTable
WHERE Score1 = 0
UNION
SELECT MAX(Value) - MIN(Value) AS Value, 1, 1, DocNo
FROM TestTable
WHERE Score1 = 1
GROUP BY DocNo
ORDER BY DocNo, Score1
DEMO
相同。
如果您使用的是 SQL Server 2012 或更高版本,您可以使用 LEAD() 函数。
WITH cte_1
AS
(SELECT VALUE,
VALUE-LEAD(VALUE) OVER(PARTITION BY DocNo ORDER BY DocNo) Result,
Source1,
Source2,
LEAD(Source1) OVER(PARTITION BY DocNo ORDER BY DocNo) NxtSource1,
LEAD(Source2) OVER(PARTITION BY DocNo ORDER BY DocNo) NxtSource2,
DocNo
FROM #myTable)
SELECT Case WHEN (Source1=1 AND NxtSource1=1) AND (Source2=0 AND NxtSource2=1) THEN Result ELSE VALUE END as Value,
Source1,Source2,DocNo
FROM cte_1
WHERE (Source1<>1 OR source2 <>1)
输出:
我有以下查询
SELECT VALUE
,Source1
,Source2
,DocNo
FROM myTable
它returns以下数据:
我想根据以下条件计算减法:
for DocNo A1
if(Source1=1 and Source2=0) VALUE 34
if(Source1=1 and Source2=0) VALUE 21
subtraction two row 34 - 21 = 13
有什么想法吗?
预期结果:
如果我对你的问题理解正确,下面的查询就是你想要的:
SELECT Value, Score1, Score2, DocNo
FROM TestTable
WHERE Score1 = 0
UNION
SELECT MAX(Value) - MIN(Value) AS Value, 1, 1, DocNo
FROM TestTable
WHERE Score1 = 1
GROUP BY DocNo
ORDER BY DocNo, Score1
DEMO
相同。
如果您使用的是 SQL Server 2012 或更高版本,您可以使用 LEAD() 函数。
WITH cte_1
AS
(SELECT VALUE,
VALUE-LEAD(VALUE) OVER(PARTITION BY DocNo ORDER BY DocNo) Result,
Source1,
Source2,
LEAD(Source1) OVER(PARTITION BY DocNo ORDER BY DocNo) NxtSource1,
LEAD(Source2) OVER(PARTITION BY DocNo ORDER BY DocNo) NxtSource2,
DocNo
FROM #myTable)
SELECT Case WHEN (Source1=1 AND NxtSource1=1) AND (Source2=0 AND NxtSource2=1) THEN Result ELSE VALUE END as Value,
Source1,Source2,DocNo
FROM cte_1
WHERE (Source1<>1 OR source2 <>1)
输出: