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_hash
在 key_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
cs
和 en
语言是强制性的。这里的 de
语言是指由人工翻译来填充。无论如何,德国用户也可以输入一些新条款。第一个输入的术语定义了密钥。我用相同的键分隔了记录。
翻译人员有时会查看数据并填写或填写必填的 cs
和 en
术语,或者为 [= 添加 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;
我确实有 table 文本翻译成(可能)多种语言。当以所选语言输入新文本时,将计算 lang_hash
。如果该文本未绑定到其他语言的任何现有文本,则 lang_hash
在 key_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
cs
和 en
语言是强制性的。这里的 de
语言是指由人工翻译来填充。无论如何,德国用户也可以输入一些新条款。第一个输入的术语定义了密钥。我用相同的键分隔了记录。
翻译人员有时会查看数据并填写或填写必填的 cs
和 en
术语,或者为 [= 添加 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;