【问题标题】:Combine two table column as per Table1 Column value falls in Table 2 column value根据Table1 合并两个表列 列值落在表2 列值中
【发布时间】:2016-04-03 02:41:56
【问题描述】:

我在表 1 中有 2 列(名称、数字),在表 2 中有 4 列(名称、最小值、最大值、颜色)。

Table1 列(Number)包含一个数值,在 Table2(Min 和 Max)中有一个范围。

我的要求是在名称列的基础上从 table1 中选择 Name、Number 和从 table2 中选择颜色。

此外,如果 Table1 中的 Number 值高于 Table2 的 Max 值,则需要从 Color 列中选择相同的行值。

**Table1 sample data:**

**Name  Number**
A       33
B       17


**Table2 sample data:**

**Name  Min   Max    Color**
A       0     20     RED
A       21    44     Yellow
A       45    45     Green
B       0     0.9    Green
B       1     15.99  Yellow
B       16    16     RED

**Output**

**Name  Number  Color**
A       33      Yellow
B       17      Red

如果对上述查询有任何困惑,请告诉我...

注意:此查询适用于 Tableau 中的自定义 SQL,因此不能使用 CTE 或高级方法。

【问题讨论】:

  • 那么任何超过 45 岁的都是绿色的?一个 SQLFIDDLE 会很好。

标签: mysql


【解决方案1】:
SELECT x.*
     , COALESCE(y.color,z.color) color 
  FROM table1 x
  LEFT 
  JOIN table2 y 
    ON y.name = x.name 
   AND x.number BETWEEN y.min AND y.max
  JOIN 
     ( SELECT a.* 
         FROM table2 a 
         JOIN 
            ( SELECT name,MAX(max) max FROM table2 GROUP BY name ) b 
           ON b.name = a.name 
          AND b.max = a.max
     ) z 
    ON z.name = x.name;

【讨论】:

  • 我只有一个问题要问你,coalesce 是否可以与 Tableau 自定义 SQL 一起使用,或者我可以使用任何其他方法?非常感谢您的努力。
  • @Aditya 我不知道画面是什么。
  • COALESCE 的目的是什么?,就像我在谷歌上做的那样,但没有成功获得实际目的。
  • 如果表 y 中没有对应的行(也就是说,如果 table1 编号大于 table2 max 的对应值),则查询将使用与最大关联的颜色价值。 COALESCE 就像 IFNULL。
【解决方案2】:

你的最终状态很奇怪。但是您可以简化逻辑:只需忽略 max 列并选择 min 小于或等于数字的最后一行:

select t1.*,
       (select t2.color
        from table2 t2
        where t1.name = t2.name and t2.min <= t1.number
        order by t2.min desc
        limit 1
       ) as color
from table1 t1;

【讨论】:

  • 我的查询低于错误消息。原因是 Table2 为 table1 中的单个名称行返回 3 行结果。消息 512,级别 16,状态 1,第 1 行子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。
猜你喜欢
  • 2017-05-28
  • 2013-06-07
  • 2021-09-17
  • 1970-01-01
  • 2016-01-20
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
相关资源
最近更新 更多