Sql 将不同表中的三列合并为一行

Sql 将不同表中的三列合并为一行,sql,db2,ibm-cloud,Sql,Db2,Ibm Cloud,我是sql新手,正在尝试将来自三个不同表的列值合并到云上DB2仓库中的一行。每个表只包含一行和唯一的列名。所以我想把这三行和它们原来的列名连接起来 每个表都是根据如下语句构建的: SELECT SUM(FUEL_TEMP.FUEL_MLAD_VALUE) AS FUEL FROM (SELECT ML_ANOMALY_DETECTION.MLAD_METRIC AS MLAD_METRIC, ML_ANOMALY_DETECTION.MLAD_VALUE AS FUEL_MLAD_VA

我是sql新手,正在尝试将来自三个不同表的列值合并到云上DB2仓库中的一行。每个表只包含一行和唯一的列名。所以我想把这三行和它们原来的列名连接起来

每个表都是根据如下语句构建的:

SELECT SUM(FUEL_TEMP.FUEL_MLAD_VALUE) AS FUEL 
FROM
    (SELECT ML_ANOMALY_DETECTION.MLAD_METRIC AS MLAD_METRIC, ML_ANOMALY_DETECTION.MLAD_VALUE AS FUEL_MLAD_VALUE, ML_ANOMALY_DETECTION.TAG_NAME AS TAG_NAME, ML_ANOMALY_DETECTION.DATETIME AS DATETIME, DATA_CONFIG.SYSTEM_NAME AS SYSTEM_NAME
     FROM ML_ANOMALY_DETECTION 
         INNER JOIN DATA_CONFIG ON 
               (ML_ANOMALY_DETECTION.TAG_NAME  =DATA_CONFIG.TAG_NAME AND 
                DATA_CONFIG.SYSTEM_NAME = 'FUEL') 
     WHERE ML_ANOMALY_DETECTION.MLAD_METRIC = 'IFOREST_SCORE'
       AND ML_ANOMALY_DETECTION.DATETIME >= (CURRENT DATE - 9 DAYS) 
     ORDER BY DATETIME DESC)
AS FUEL_TEMP
SELECT
  WarehouseDB1.WarehouseID AS TheID,
  'A' AS TheSystem,
  WarehouseDB1.TheValue AS TheValue
FROM WarehouseDB1
UNION
SELECT
  WarehouseDB2.WarehouseID AS TheID,
  'B' AS TheSystem,
  WarehouseDB2.TheValue AS TheValue
FROM WarehouseDB2
UNION
  WarehouseDB3.WarehouseID AS TheID,
  'C' AS TheSystem,
  WarehouseDB3.TheValue AS TheValue
FROM WarehouseDB3
create table table1 (field1 char(10));
create table table2 (field2 char(10));
create table table3 (field3 char(10));

insert into table1 values('value1');
insert into table2 values('value2');
insert into table3 values('value3');

select *
  from table1
  cross join table2
  cross join table3;

我试过JOIN、Internal JOIN、UNION/UNION ALL,但无法让它正常工作。我怎样才能做到这一点呢?

使用UNION应该可以解决您的问题。大概是这样的:

SELECT SUM(FUEL_TEMP.FUEL_MLAD_VALUE) AS FUEL 
FROM
    (SELECT ML_ANOMALY_DETECTION.MLAD_METRIC AS MLAD_METRIC, ML_ANOMALY_DETECTION.MLAD_VALUE AS FUEL_MLAD_VALUE, ML_ANOMALY_DETECTION.TAG_NAME AS TAG_NAME, ML_ANOMALY_DETECTION.DATETIME AS DATETIME, DATA_CONFIG.SYSTEM_NAME AS SYSTEM_NAME
     FROM ML_ANOMALY_DETECTION 
         INNER JOIN DATA_CONFIG ON 
               (ML_ANOMALY_DETECTION.TAG_NAME  =DATA_CONFIG.TAG_NAME AND 
                DATA_CONFIG.SYSTEM_NAME = 'FUEL') 
     WHERE ML_ANOMALY_DETECTION.MLAD_METRIC = 'IFOREST_SCORE'
       AND ML_ANOMALY_DETECTION.DATETIME >= (CURRENT DATE - 9 DAYS) 
     ORDER BY DATETIME DESC)
AS FUEL_TEMP
SELECT
  WarehouseDB1.WarehouseID AS TheID,
  'A' AS TheSystem,
  WarehouseDB1.TheValue AS TheValue
FROM WarehouseDB1
UNION
SELECT
  WarehouseDB2.WarehouseID AS TheID,
  'B' AS TheSystem,
  WarehouseDB2.TheValue AS TheValue
FROM WarehouseDB2
UNION
  WarehouseDB3.WarehouseID AS TheID,
  'C' AS TheSystem,
  WarehouseDB3.TheValue AS TheValue
FROM WarehouseDB3
create table table1 (field1 char(10));
create table table2 (field2 char(10));
create table table3 (field3 char(10));

insert into table1 values('value1');
insert into table2 values('value2');
insert into table3 values('value3');

select *
  from table1
  cross join table2
  cross join table3;
如果你告诉我它们是什么,我会用你的表名和行修改代码。此类查询将返回如下内容:

TheID   TheSystem   TheValue
  1         A          10
  2         A          20
  3         B          30
  4         C          40
  5         C          50

只要您的列名在每个查询中匹配,您就应该得到所需的结果。

使用UNION应该可以解决您的问题。大概是这样的:

SELECT SUM(FUEL_TEMP.FUEL_MLAD_VALUE) AS FUEL 
FROM
    (SELECT ML_ANOMALY_DETECTION.MLAD_METRIC AS MLAD_METRIC, ML_ANOMALY_DETECTION.MLAD_VALUE AS FUEL_MLAD_VALUE, ML_ANOMALY_DETECTION.TAG_NAME AS TAG_NAME, ML_ANOMALY_DETECTION.DATETIME AS DATETIME, DATA_CONFIG.SYSTEM_NAME AS SYSTEM_NAME
     FROM ML_ANOMALY_DETECTION 
         INNER JOIN DATA_CONFIG ON 
               (ML_ANOMALY_DETECTION.TAG_NAME  =DATA_CONFIG.TAG_NAME AND 
                DATA_CONFIG.SYSTEM_NAME = 'FUEL') 
     WHERE ML_ANOMALY_DETECTION.MLAD_METRIC = 'IFOREST_SCORE'
       AND ML_ANOMALY_DETECTION.DATETIME >= (CURRENT DATE - 9 DAYS) 
     ORDER BY DATETIME DESC)
AS FUEL_TEMP
SELECT
  WarehouseDB1.WarehouseID AS TheID,
  'A' AS TheSystem,
  WarehouseDB1.TheValue AS TheValue
FROM WarehouseDB1
UNION
SELECT
  WarehouseDB2.WarehouseID AS TheID,
  'B' AS TheSystem,
  WarehouseDB2.TheValue AS TheValue
FROM WarehouseDB2
UNION
  WarehouseDB3.WarehouseID AS TheID,
  'C' AS TheSystem,
  WarehouseDB3.TheValue AS TheValue
FROM WarehouseDB3
create table table1 (field1 char(10));
create table table2 (field2 char(10));
create table table3 (field3 char(10));

insert into table1 values('value1');
insert into table2 values('value2');
insert into table3 values('value3');

select *
  from table1
  cross join table2
  cross join table3;
如果你告诉我它们是什么,我会用你的表名和行修改代码。此类查询将返回如下内容:

TheID   TheSystem   TheValue
  1         A          10
  2         A          20
  3         B          30
  4         C          40
  5         C          50

只要您的列名在每个查询中匹配,您就应该得到所需的结果。

使用如下交叉连接:

SELECT SUM(FUEL_TEMP.FUEL_MLAD_VALUE) AS FUEL 
FROM
    (SELECT ML_ANOMALY_DETECTION.MLAD_METRIC AS MLAD_METRIC, ML_ANOMALY_DETECTION.MLAD_VALUE AS FUEL_MLAD_VALUE, ML_ANOMALY_DETECTION.TAG_NAME AS TAG_NAME, ML_ANOMALY_DETECTION.DATETIME AS DATETIME, DATA_CONFIG.SYSTEM_NAME AS SYSTEM_NAME
     FROM ML_ANOMALY_DETECTION 
         INNER JOIN DATA_CONFIG ON 
               (ML_ANOMALY_DETECTION.TAG_NAME  =DATA_CONFIG.TAG_NAME AND 
                DATA_CONFIG.SYSTEM_NAME = 'FUEL') 
     WHERE ML_ANOMALY_DETECTION.MLAD_METRIC = 'IFOREST_SCORE'
       AND ML_ANOMALY_DETECTION.DATETIME >= (CURRENT DATE - 9 DAYS) 
     ORDER BY DATETIME DESC)
AS FUEL_TEMP
SELECT
  WarehouseDB1.WarehouseID AS TheID,
  'A' AS TheSystem,
  WarehouseDB1.TheValue AS TheValue
FROM WarehouseDB1
UNION
SELECT
  WarehouseDB2.WarehouseID AS TheID,
  'B' AS TheSystem,
  WarehouseDB2.TheValue AS TheValue
FROM WarehouseDB2
UNION
  WarehouseDB3.WarehouseID AS TheID,
  'C' AS TheSystem,
  WarehouseDB3.TheValue AS TheValue
FROM WarehouseDB3
create table table1 (field1 char(10));
create table table2 (field2 char(10));
create table table3 (field3 char(10));

insert into table1 values('value1');
insert into table2 values('value2');
insert into table3 values('value3');

select *
  from table1
  cross join table2
  cross join table3;
结果:

field1     field2     field3
---------- ---------- ----------
value1     value2     value3

交叉连接将左侧的所有行与右侧的所有行连接起来。最终将得到行的乘积(表1行x表2行x表3行)。由于每个表只有一行,您将得到(1 x 1 x 1)=1行。

使用如下交叉连接:

SELECT SUM(FUEL_TEMP.FUEL_MLAD_VALUE) AS FUEL 
FROM
    (SELECT ML_ANOMALY_DETECTION.MLAD_METRIC AS MLAD_METRIC, ML_ANOMALY_DETECTION.MLAD_VALUE AS FUEL_MLAD_VALUE, ML_ANOMALY_DETECTION.TAG_NAME AS TAG_NAME, ML_ANOMALY_DETECTION.DATETIME AS DATETIME, DATA_CONFIG.SYSTEM_NAME AS SYSTEM_NAME
     FROM ML_ANOMALY_DETECTION 
         INNER JOIN DATA_CONFIG ON 
               (ML_ANOMALY_DETECTION.TAG_NAME  =DATA_CONFIG.TAG_NAME AND 
                DATA_CONFIG.SYSTEM_NAME = 'FUEL') 
     WHERE ML_ANOMALY_DETECTION.MLAD_METRIC = 'IFOREST_SCORE'
       AND ML_ANOMALY_DETECTION.DATETIME >= (CURRENT DATE - 9 DAYS) 
     ORDER BY DATETIME DESC)
AS FUEL_TEMP
SELECT
  WarehouseDB1.WarehouseID AS TheID,
  'A' AS TheSystem,
  WarehouseDB1.TheValue AS TheValue
FROM WarehouseDB1
UNION
SELECT
  WarehouseDB2.WarehouseID AS TheID,
  'B' AS TheSystem,
  WarehouseDB2.TheValue AS TheValue
FROM WarehouseDB2
UNION
  WarehouseDB3.WarehouseID AS TheID,
  'C' AS TheSystem,
  WarehouseDB3.TheValue AS TheValue
FROM WarehouseDB3
create table table1 (field1 char(10));
create table table2 (field2 char(10));
create table table3 (field3 char(10));

insert into table1 values('value1');
insert into table2 values('value2');
insert into table3 values('value3');

select *
  from table1
  cross join table2
  cross join table3;
结果:

field1     field2     field3
---------- ---------- ----------
value1     value2     value3

交叉连接将左侧的所有行与右侧的所有行连接起来。最终将得到行的乘积(表1行x表2行x表3行)。由于每个表只有一行,您将得到(1 x 1 x 1)=1行。

当询问qeustions时,阅读是一个好的开始。上面的查询是一个1表查询的示例吗?您基本上需要这样做3次,然后将其转换为1视图?是的,这是一个表查询,我希望成为结果表中的一列。是的,我想把其中三个合并到一个三列一行的表中@Crezzer7好的,这3个表的名称是什么,以及您想要的列是什么?所以,您有3个表,每个表中有1行。你要把这三个值相加。您可以尝试将其合并到一个包含3行的表中,然后对所有值求和。表1 union all table 2Reading在询问qeustions时是一个很好的开始。上面的查询是一个有效的1表查询示例吗?您基本上需要执行3次,然后将其转换为1视图?是的,它是一个表查询,我希望成为结果表中的一列。是的,我想把其中三个合并到一个三列一行的表中@Crezzer7好的,这3个表的名称是什么,以及您想要的列是什么?所以,您有3个表,每个表中有1行。你要把这三个值相加。您可以尝试将其合并到一个包含3行的表中,然后对所有值求和。表1 union all表2这并不能解决问题。我有一个表,列名为“Fuel”和一行,一个表有“Boiler”和一行,最后一个表有“residence”和一行。这三个表有一行一列,每个表有不同的名称,我想将它们组合成一行一表,三列对应它们的名称。啊,好的,我现在明白了,我想你可能需要将这些表合并在一起,所以数据都在一个地方,然后将其转置。。。也许这会有所帮助:这并不能解决问题。我有一个表,列名为“Fuel”和一行,一个表有“Boiler”和一行,最后一个表有“residence”和一行。这三个表有一行一列,每个表有不同的名称,我想将它们组合成一行一表,三列对应它们的名称。啊,好的,我现在明白了,我想你可能需要将这些表合并在一起,所以数据都在一个地方,然后将其转置。。。也许这会有帮助: