【问题标题】:Transpose the resulted rows in Oracle 9i在 Oracle 9i 中转置结果行
【发布时间】:2013-09-07 17:11:48
【问题描述】:

我有以下表格:
1.UNIT_OF_MEASURE:列:UNIT_OF_MEASURE, CODE, DESCRIPTION, VERSION
2.UNIT_OF_MEASURE_TRANS:列:UNIT_OF_MEASURE_ID_LANGAUGE_ID, DESCRIPTION
3.LANGUAGE:列:LANGUAGE_ID, LANGUAGE_NAME

我试图做的是用 5 种语言显示所有度量单位的描述。我已经成功地做到了这一点,但作为一个列表,即一列中的所有描述以不同的语言重复。

SELECT 
    uomt.description, 
    l.language_name
FROM unit_of_measure_trans uomt
INNER JOIN language l ON (uomt.language_id = l.language_id)
WHERE 
  l.language_id IN (25, 22, 82, 34, 27, 52, 10, 90)
order by language_name;

`

现在,我需要对此进行改进,以根据语言在单独的列中显示每组描述。所以我将有五列包含不同语言的同一组度量单位描述。我尝试了slef-join,但得到了笛卡尔积结果,不确定union all 是否能解决问题。我在这里查看了几篇关于转置的帖子,恐怕我无法将其中任何一篇应用于我的案例。

【问题讨论】:

标签: sql oracle oracle9i


【解决方案1】:

要模拟 PIVOT,您可以使用 CASE、MAX 和 GROUP BY 的组合:

SELECT 
    max(case when language_name = 'English' then uomt.description else null end)
       as english_description,
    max(case when language_name = 'German' then uomt.description else null end)
       as german_description,
    uomt.unit_of_measure_id
FROM unit_of_measure_trans uomt
INNER JOIN language l ON (uomt.language_id = l.language_id)
group by uomt.unit_of_measure_id
order by uomt.unit_of_measure_id;

SQL Fiddle

【讨论】:

    【解决方案2】:

    挖掘出来后,我们会发现很多类似的问题,我可以系统地陈述答案如下:
    1.为了将列转置为行,您可以使用UNION ALLhere
    2. 为了应用 PIVOT 表,您应该考虑以下 oracle 版本:
    一种。 Oracle 11g:您可以使用Built In PIVOT Featurehere
    湾。 Oracle 10g 和 9i:您只能使用 [CASE WHEN][4] 表达式或 [DECODE][5] 表达式。 C。 Oracle 8i:你被限制使用DECODE 表达式

    对于我上面的问题,我找到了如下解决方案:

    SELECT uom.code, MAX(CASE WHEN l.language_id = 25 THEN uomt.description ELSE NULL END) AS english, MAX(CASE WHEN l.language_id = 22 THEN uomt.description ELSE NULL END) AS german FROM unit_of_measure uom INNER JOIN unit_of_measure_trans uomt ON (uom.unit_of_measure_id = uomt.unit_of_measure_id) INNER JOIN language l ON (uomt.language_id = l.language_id) WHERE l.language_id IN (25, 22)) GROUP BY uom.code;

    请注意,在CASE WHEN 表达式中,如果不使用聚合函数,除非删除GROUP BY 表达式,否则会出错。但是,在后一种情况下,您将获得所有空值,这是很少有用的结果

    【讨论】:

      猜你喜欢
      • 2013-08-29
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 2018-01-09
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      相关资源
      最近更新 更多