【问题标题】:SQL Server, find cross value in different columnsSQL Server,在不同的列中查找交叉值
【发布时间】:2018-12-19 03:50:31
【问题描述】:

我需要帮助进行 sql server 查询。我有很多这样的行,我的表有 3 列,如 a、b、c。

      a          b          c
     ---        ---        ---
    hello      world       10
     hey        you        80
    world      hello       20
     my         day        15
    merhaba    dunya       40
    bugun      nasilsin    75
    dunya      merhaba     20

所以我想通过添加 c 列值来查找不同列中的交叉值。所以在查询之后我想看到那个;

      a          b          c
     ---        ---        ---
    hello      world       30
     hey        you        80
      my        day        15
    merhaba    dunya       60
     bugun     nasilsin    75

对不起,我的英语不好,谢谢你的回答......

编辑:答案不起作用。我都试过了。你对这个解决方案有什么想法吗?

【问题讨论】:

  • 这种类型的只有 2 行还是很多?
  • 这样的行太多了。
  • 很不明白你可以使用的总和。 -> select sum(c) from table group by 1=1
  • 所以您要考虑 b 列值等于 a 列值的组并将 c 列相加?
  • 是的,我想将 a 列的值等于 b 列,b 列等于 a 列的总和 c 进行分组。我编辑了我的问题以获得更多解释。

标签: sql sql-server multiple-columns sql-server-2017


【解决方案1】:

这是一种方法

create table t(a varchar(10), b varchar(10), c varchar(10))

insert into t values('hello','world',10)
insert into t values('world','hello',20)

select  min(a) as a
       ,max(b) as b
       ,sum(cast(c as int)) as c
  from t as x
 group by case when a>b then a
            else b
       end

【讨论】:

  • 但是我有很多这样的行,我编辑了我的问题。感谢您的评论,但我怎样才能将这种方式应用于所有行?
  • 您的预期结果是什么?您实际得到了什么?
【解决方案2】:

如果存在不匹配的行,或“对”,则:

CREATE TABLE mytable(
   a      VARCHAR(50) NOT NULL
  ,b      VARCHAR(50) NOT NULL
  ,c      INTEGER  NOT NULL
);
INSERT INTO mytable(a,b,c) VALUES ('hello','world',10);
INSERT INTO mytable(a,b,c) VALUES ('hey','you',80);
INSERT INTO mytable(a,b,c) VALUES ('world','hello',20);
INSERT INTO mytable(a,b,c) VALUES ('my','day',15);
INSERT INTO mytable(a,b,c) VALUES ('merhaba','dunya',40);
INSERT INTO mytable(a,b,c) VALUES ('bugun','nasilsin',75);
INSERT INTO mytable(a,b,c) VALUES ('dunya','merhaba',20);


GO
7 行受影响
select t.a, t.b, sum(t.c + coalesce(t2.c,0))
from mytable t
left join mytable t2 on t.a = t2.b and t.b = t2.a
group by  t.a, t.b


GO
一个 |乙 | (无列名) :-------- | :------- | ---------------: 我的 |天 | 15 梅哈巴 |敦雅 | 60 世界|你好 | 30 敦雅 |梅哈巴 | 60 布根 |鼻涕素 | 75 你好 |世界| 30 嘿|你 | 80

db小提琴here

【讨论】:

  • tt2 是“别名” - 分配给表 mytable 的名称,以便查询可以执行“自联接”
  • 您好先生,再次感谢您的评论,但我有一个问题。您的代码是返回此表;一个 |乙 | (无列名):------ | :------- | ---------------:我的|天 | 15 梅哈巴 |敦雅 | 60世界 |你好 | 30 顿亚 |梅哈巴 | 60 布贡 |鼻涕素 | 75 你好世界| 30 嘿|你 | 80 但我们不想看到“dunya merhaba 60”和“hello word 30”行。如何解决这个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
相关资源
最近更新 更多