1

我有以下表格:
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能解决问题。我在这里查看了几篇关于转置的帖子,恐怕我无法将其中任何一篇应用于我的案例。

4

2 回答 2

3

要模拟 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小提琴

于 2013-09-04T10:14:20.927 回答
0

挖掘出来后我们会发现很多类似的问题,我可以系统地给出如下答案:
1.为了将列转置为行,你可以UNION ALL 在这里
使用 2.为了应用 PIVOT 表你应该考虑 oracle 版本如下
: . Oracle 11g:您可以在此处使用内置 PIVOT 功能b 。Oracle 10g 和 9i:您只能使用表达式或表达式。C。Oracle 8i:您只能使用表达式
[CASE WHEN][4][DECODE][5]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-09-04T11:58:49.063 回答