SQL: 如何按键对数据进行分区并按定义的顺序转置三元组? (人类语言翻译工具。)

SQL: How to partition data by the key and transpose the triples in the defined order? (The tool for a human-language translator.)

我确实有 table 文本翻译成(可能)多种语言。当以所选语言输入新文本时,将计算 lang_hash。如果该文本未绑定到其他语言的任何现有文本,则 lang_hashkey_hash 中重复,并且与语言代码一起插入新记录。对于捷克语、英语和德语,table 的内容可能如下所示:

key_hash      lang  lang_hash       lang_text
0x38E6AA2C5C    de  0x38E6AA2C5C    die Orange
0x38E6AA2C5C    en  0xFBD2896D64    the orange

0x4DD9B471C8    en  0x4DD9B471C8    tomato

0x662A839B85    de  0x662A839B85    die Melone
0x662A839B85    en  0xD79A09DA7E    the watermelon

0x6A0D439BF6    de  0x6A0D439BF6    die Birne

0x6F1EDE3767    cs  0x0541D7A777    jablko
0x6F1EDE3767    de  0x6F1EDE3767    der Apfel
0x6F1EDE3767    en  0xE50ED37D59    the apple

0xA5FC751D4B    cs  0xA5FC751D4B    ananas

0xC0D6B4BECA    cs  0x1ED2658D57    banán
0xC0D6B4BECA    de  0xC0D6B4BECA    die Banane

csen 语言是强制性的。这里的 de 语言是指由人工翻译来填充。无论如何,德国用户也可以输入一些新条款。第一个输入的术语定义了密钥。我用相同的键分隔了记录。

翻译人员有时会查看数据并填写或填写必填的 csen 术语,或者为 [= 添加 de 翻译16=] 和 en 等价物。

他或她应该总是使用恰好三种语言:cs、en 和所选语言。说,德是现在选择的那个。翻译者应该看到这样的 table(key_hash 将不可见):

任务是输入所有空白(粉红色)字段。

如何编写 SQL 查询来获得如图所示的组织结果,空字段的值为 NULL?有什么优雅的方法可以根据key_hash对数据进行分区,然后按照cs,en,de的顺序转置语言记录?

更新: 到目前为止,我有以下显示我需要的查询。但是,对我来说似乎有点难看。而且,我将来会有更多的数据,我不确定它是否对他们有用。 (抱歉捷克语标识符:klic 表示密钥,jazyk 表示语言,preklady 表示翻译)

DECLARE @lang varchar(2) = 'de'

SELECT COALESCE(cs.klic_hash, en.klic_hash, xx.klic_hash) AS klic_hash,
       cs.jazyk_text AS cs_text,
       en.jazyk_text AS en_text, 
       xx.jazyk_text AS xx_text
  FROM (SELECT klic_hash, jazyk_text FROM preklady WHERE jazyk = 'cs') AS cs
       FULL OUTER JOIN (SELECT klic_hash, jazyk_text FROM preklady WHERE jazyk = 'en') AS en
            ON cs.klic_hash = en.klic_hash 
       FULL OUTER JOIN (SELECT klic_hash, jazyk_text FROM preklady WHERE jazyk = @lang) AS xx
            ON COALESCE(cs.klic_hash, en.klic_hash) = xx.klic_hash

您需要条件聚合:

DECLARE @lang char(2) = 'de'

SELECT klic_hash,
       MIN(CASE WHEN jazyk = 'cs'  THEN cs.jazyk_text END) AS cs_text,
       MIN(CASE WHEN jazyk = 'en'  THEN cs.jazyk_text END) AS en_text, 
       MIN(CASE WHEN jazyk = @lang THEN cs.jazyk_text END) AS xx_text
FROM preklady
GROUP BY klic_hash;