SQL查询 - 当表中的其他列具有特定值时,用于分隔列的行

时间:2018-03-30 11:35:33

标签: mysql pivot oracledb

我陷入了OracleDB中的特定任务。我正在使用SQLDeveloper编写sql查询,我需要将行转换为与其他列数据相关的列。

当在“SPRID”列中,值为“DE”且“ARTTXTNUMMER”为“1”时,我需要将“ARTTXTTXT”的值放在“TXT1-DE”栏中。 当在“SPRID”列中,值为“IT”且“ARTTXTNUMMER”为“1”时,我需要将“ARTTXTTXT”的值放在与“TXT1”的值相同的行“TXT1-IT”中-DE”。 当在“SPRID”列中,值为“DE”而“ARTTXTNUMMER”为“2”时,我需要将“ARTTXTTXT”的值放在“TXT2-DE”栏中。 当在“SPRID”列中,值为“IT”而“ARTTXTNUMMER”为“2”时,我需要将“ARTTXTTXT”的值放在“TXT2-IT”列中。

我甚至用2张桌子进行了LEFT JOIN。

我的查询如下:

SELECT
    artikel.artid,
    artikel.artkode,
    artikel.artbarcode,
    artikeltexte.arttxtnummer,
    artikeltexte.sprid,
    artikeltexte.arttxttext,
    artikel.herstellid
FROM
    artikel
    LEFT JOIN artikeltexte ON artikel.artid = artikeltexte.artid

输出是这样的:

ARTID   ARTKODE ARTBARCODE  ARTTXTNUMMER    SPRID   ARTTXTTEXT  HERSTELLID
074L    260631 802863300108 1   DE  txt074L-1-DE    4568794H
074L    260631 802863300108 1   IT  txt074L-1-IT    4568794H
074L    260631 802863300108 2   DE  txt074L-2-DE    4568794H
074L    260631 802863300108 2   IT  txt074L-2-IT    4568794H
071A    784520 80781200896  1   DE  txt071A-1-DE    4577882H
071A    784520 80781200896  1   IT  txt071A-1-IT    4577882H
073W    898000 87846213567  1   DE  txt073W-1-DE    4505020H
073W    898000 87846213567  1   IT  txt073W-1-IT    4505020H
073W    898000 87846213567  2   DE  txt073W-2-DE    4505020H
073W    898000 87846213567  2   IT  txt073W-2-IT    4505020H

正如您所看到的,每篇文章都有多行。我需要每篇文章有一行,其中包含以下列中的信息:

    ARTID   ARTKODE ARTBARCODE  ARTTXTTEXT  HERSTELLID  TXT1-DE TXT1-IT TXT2-DE TXT2-IT
074L    260631  802863300108    txt074L-1-DE    4568794H    txt074L-1-DE    txt074L-1-IT    txt074L-2-DE    txt074L-2-IT
071A    784520  80781200896 txt071A-1-DE    4577882H    txt071A-1-DE    txt071A-1-IT        
073W    898000  87846213567 txt073W-2-IT    4505020H    txt073W-1-DE    txt073W-1-IT    txt073W-2-DE    txt073W-2-IT

1 个答案:

答案 0 :(得分:0)

对于选择性过滤器和(假)聚合,您可以使用CASE  (此示例中为min)函数用于压缩行

  SELECT
      artikel.artid,
      artikel.artkode,
      artikel.artbarcode,
      artikeltexte.arttxtnummer,
      artikeltexte.arttxttext,
      artikel.herstellid,
      min(case when SPRID = 'DE' and ARTTXTNUMMER = 1 THEN ARTTXTTXT else null END ) TXT1_DE, 
      min(case when SPRID = 'IT' and ARTTXTNUMMER = 1 THEN ARTTXTTXT else null END ) TXT1_IT,  
      min(case when SPRID = 'DE' and ARTTXTNUMMER = 2 THEN ARTTXTTXT else null END ) TXT2_DE, 
      min(case when SPRID = 'IT' and ARTTXTNUMMER = 2 THEN ARTTXTTXT else null END ) TXT2_IT  
  FROM
      artikel
      LEFT JOIN artikeltexte ON artikel.artid = artikeltexte.artid
  GROUP BY artikel.artid,
      artikel.artkode,
      artikel.artbarcode,
      artikeltexte.arttxtnummer,
      artikeltexte.arttxttext,
      artikel.herstellid

如果你需要为每个artikle添加一行,你应该删除(或group_concat)不允许合适的组的值,例如:

    SELECT
      artikel.artid,
      artikel.artkode,
      artikel.artbarcode,
      artikel.herstellid,
      min(case when SPRID = 'DE' and ARTTXTNUMMER = 1 THEN ARTTXTTXT else null END ) TXT1_DE, 
      min(case when SPRID = 'IT' and ARTTXTNUMMER = 1 THEN ARTTXTTXT else null END ) TXT1_IT,  
      min(case when SPRID = 'DE' and ARTTXTNUMMER = 2 THEN ARTTXTTXT else null END ) TXT2_DE, 
      min(case when SPRID = 'IT' and ARTTXTNUMMER = 2 THEN ARTTXTTXT else null END ) TXT2_IT  
  FROM
      artikel
      LEFT JOIN artikeltexte ON artikel.artid = artikeltexte.artid
  GROUP BY artikel.artid,
      artikel.artkode,
      artikel.artbarcode,
      artikel.herstellid