如何基于两个表创建新列和新行?

时间:2021-04-30 07:09:47

标签: mysql sql

我有两张桌子:

表一

    MARKET      ATC3     ATC4    PRODUCT    BOOLEAN FLAG    JOINING COLUMN
    A1          B1     B1C1       D1           1                     ATC4
    A2          B1     B1C2       D2           1                     ATC4
    A2          B1     B1C3                                          ATC4
    FAMILY A    B1                                                   ATC3

表 2:

PRODUCT ATC3    ATC4    VALUES
D1       B1   B1C1  10
D1       B1   B1C1  20
D2       B1   B1C2  15
D2       B1   B1C2  25
D2       B1   B1C2  10
D3       B1   B1C3  5

我想要的输出:

PRODUCT       ATC3  ATC4    VALUES  MARKET  VALUES
D1             B1     B1C1  10       A1     10
D1             B1     B1C1  20       A1     20
D2             B1     B1C2  15       A2     15
D2             B1     B1C2  25       A2     25
D2             B1     B1C2  10       A2     10
D3             B1     B1C3  5        A2      5
ALL D1+D2+D3                         FAMILY A   85

这个想法是,表 2 有很多行和产品,但没有 Market。表 1 可帮助您根据 Joining column 找出表 2 中的哪个产品属于哪个 Market-based。例如,表 1 中有 3 个市场,然后我想在表 2 中分配一个新列市场,以便表 2 中所有具有 B1C1 ATC4 代码的产品都属于市场 A1。为什么?因为在表 1 中,它说市场 A1 应该遵循 ATC4 的加入列 - 对应于代码 B1C1。在表 1 中,我们还提供了一个 Product 列,这只是为了识别我们自己公司的产品名称。现在如果你看到表 1 有两行市场 A2,有不同的 ATC4,这是很正常的,因为也许产品 D2 和 D10 属于市场 A2,但两者可能包含不同的 ATC4!

还有一个细微差别,我们有家庭 A!这只是A1+A2的组合,但在我的表2中,并没有这样的行值加起来为家庭A。所以我需要实现两件事:

  1. 我想在表 2 中创建一个新列 Market,以便将每个产品映射到市场。

  2. 我想创建额外的行来说明市场系列 A (A1+A2) 并将产品名称命名为“可爱的家庭 A”或其他名称。上表 3 提供了预期的输出。

由于我是SQL的新手,我尝试先用CASE语句,慢慢的一一映射,但很快就很乏味,不知道有没有什么技巧。

我的 CASE 看起来像这样

  ,CASE WHEN ATC4 LIKE '%B1C1%' THEN 'A1' 
         WHEN ATC4 LIKE '%B1C2%' OR ATC4 LIKE '%B1C3%' THEN 'A2'  ELSE ATC4 END AS MARKET_NAME

但还没有弄清楚如何添加额外的行,我可以在其中总结 A1+A2。

1 个答案:

答案 0 :(得分:0)

你似乎想要这样的东西:

with rows as (
      select PRODUCT, ATC3, ATC4, VALUES
      from table2
      union all
      select 'ALL D1+D2+D3', ATC3, NULL, SUM(VALUES)
      from table2
      group by ATC3
     )
select r.*, t1.market
from rows r join
     table1 t1
     on (t1.joining_column = 'ATC3' and t1.atc3 = r.atc3) or
        (t1.joining_column = 'ATC4' and t1.atc4 = r.atc4);

我认为没有理由重复 values 列。而 values 是一个非常糟糕的列名称,因为它是一个 SQL 关键字。

相关问题