我陷入了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
答案 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