在MS ACCESS数据库中将行对转置为列的SQL

6

我有一个MS Access数据库,其中包含源目标对中的翻译句子(一种计算机辅助翻译工具的翻译记忆库)。有点让人恼火的是,源和目标并未分别存储在不同的列中,而是通过ID链接的行中存储,就像这样:

+---+----+--------------+
|id |lang|    text      |
+---+----+--------------+
  1   a     lang a text
  1   b     lang b text 
  2   a     more a text...
  2   b     more b text...
+---+----+--------------+

我可以使用什么SQL将其转换成如下的表格:

+---+--------------+--------------+
|id | lang A       | lang B       |
+---+--------------+--------------+
 1   lang a text    lang b text
 2   more a text... more b text...

这里性能并不重要,因为我只需要偶尔执行此操作,并且数据库不是很大(只有几千行)。

4个回答

7
一个交叉表查询应该适合。
TRANSFORM First([Text]) AS LangText
SELECT ID, First([Text])
FROM Table 
GROUP BY ID
PIVOT lang

更多信息: http://allenbrowne.com/ser-67.html

谢谢,我之前不知道 TRANSFORM 这个函数。它产生了我需要的结果。Access 似乎会添加一个名为“Expr1003”的列,其内容与语言 a(源)相同,但我可以忽略它。 - Marek Jedliński

2

你需要使用自连接:

SELECT
    t1.id, t1.text AS lang_a, t2.text AS lang_b
FROM
    lang_table AS t1
INNER JOIN
    lang_table AS t2
ON
    (t1.id = t2.id)
WHERE
    t1.lang = 'a'
AND
    t2.lang = 'b'

在Access中,这将生成一个具有正确列的表,但是lang_a和lang_b列都包含相同的语言文本(lang_a)。它只是显示每个记录的lang_a两次。我意识到这违反了WHERE条件,但这就是我得到的结果。(续) - Marek Jedliński
将 t1.lang 和 t2.lang 添加到 select 中会显示正确的语言 ID。我已经查看了几次,但还没有能够找出问题所在。 - Marek Jedliński

0
SELECT a.id,
MAX(CASE WHEN a.lang LIKE 'a' THEN a.text) AS Lang A,
MAX(CASE WHEN a.lang LIKE 'a' THEN a.text) AS Lang A
FROM table a
GROUP BY a.id

0
select a.id, a.text as 'lang A', b.text as 'lang B'
from table a join table b on (a.id = b.id)
where a.lang = 'a' and b.lang = 'b';

其中“table”是这些表格所在的任何表格。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接