添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

如果两行在另一列中共享一个值,如何从另一列中减去两行的值?

1 人关注

我目前在一个具有以下结构的数据库中工作。

Var | Value | ID
--------------
  A |   1   | 1
  B |   2   | 1
  C |   3   | 1
  A |   2   | 2
  B |   4   | 2
  C |   6   | 2

我想实现的是,从与C共享相同ID的其他Var(B和C)中减去C的值,在这种情况下,输出将是。

Var | Value | ID
--------------
  A |  -2   | 1
  B |  -1   | 1
  C |   3   | 1
  A |  -4   | 2
  B |  -2   | 2
  C |   6   | 2

说实话,我完全不知道该如何开始实现这个目标。我熟悉许多其他的编程语言,但SQL仍然是一个困难/特殊查询的挑战。

sql
sql-server
sql-server-2008
BallzofFury
BallzofFury
发布于 2015-12-17
2 个回答
jarlh
jarlh
发布于 2015-12-17
已采纳
0 人赞同

做一个自我连接。

select t1.var,
       case when t1.var = 'C' then t1.value
            else t1.value - t2.value
       end as value,
       t1.id
from tablename t1
  join tablename t2 ON t1.id = t2.id
where t2.var = 'C'

注意,在ANSI SQL中,value 是一个保留字,所以应该用"Value" 来分隔。

似乎是正确的答案,但我更倾向于使用 left join ,以防有些id缺少 c 值。
转换为 LEFT JOIN ,没有问题,但OP必须描述在没有C var的情况下,要返回哪个值?
应该是每个ID都有一个C var,但我会牢记这一点,以防出现任何问题!
Richard Hansell
Richard Hansell
发布于 2015-12-17
0 人赞同

你可以预先分析 "C "值,然后用它来删除它们?

DECLARE @Data TABLE (
    [Var] VARCHAR(1),
    Value INT,
    ID INT);
INSERT INTO @Data SELECT 'A', 1, 1;
INSERT INTO @Data SELECT 'B', 2, 1;
INSERT INTO @Data SELECT 'C', 3, 1;
INSERT INTO @Data SELECT 'A', 2, 2;
INSERT INTO @Data SELECT 'B', 4, 2;
INSERT INTO @Data SELECT 'C', 6, 2;
WITH CValues AS (
    SELECT
        Value
        @Data
    WHERE
        [Var] = 'C')
SELECT
    d.[Var],
    CASE WHEN d.[Var] != 'C' THEN d.Value - c.Value ELSE d.Value END AS Value,
    @Data d
    LEFT JOIN CValues c ON c.ID = d.ID;

...但是,是的,自我连接可能是一个更好的解决方案。

DECLARE @Data TABLE (
    [Var] VARCHAR(1),
    Value INT,
    ID INT);
INSERT INTO @Data SELECT 'A', 1, 1;
INSERT INTO @Data SELECT 'B', 2, 1;
INSERT INTO @Data SELECT 'C', 3, 1;
INSERT INTO @Data SELECT 'A', 2, 2;
INSERT INTO @Data SELECT 'B', 4, 2;
INSERT INTO @Data SELECT 'C', 6, 2;
SELECT
    d.[Var],
    CASE WHEN d.[Var] != 'C' THEN d.Value - c.Value ELSE d.Value END AS Value,