2009-04-10 12 views
4

J'ai une base de données MS Access qui contient des phrases traduites dans des paires source-cible (une mémoire de traduction pour les autres utilisateurs d'outils CAT). source et cible un peu agaçant, ne sont pas stockées dans des colonnes séparées, mais en lignes reliées par ID, comme ceci:SQL pour transposer des paires de lignes en colonnes dans la base de données MS ACCESS

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

Que SQL pourrais-je utiliser pour le transformer en une table telle que:

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

Les performances n'ont pas d'importance ici, car je n'aurais besoin de le faire qu'une fois de temps en temps, et la db n'est pas énorme (seulement quelques milliers de lignes).

Répondre

6

Une requête de tableau croisé devrait convenir.

TRANSFORM First([Text]) AS LangText 
SELECT ID, First([Text]) 
FROM Table 
GROUP BY ID 
PIVOT lang 

Informations complémentaires:. http://allenbrowne.com/ser-67.html

+0

Merci, je ne connaissais pas TRANSFORM. Il produit exactement le résultat dont j'ai besoin. Access semble ajouter une colonne nommée "Expr1003", avec le même contenu que la langue a (source), mais je peux simplement l'ignorer. –

+0

Vous pouvez simplement modifier la ligne SELECT pour lire: SELECT ID – Fionnuala

2

Vous avez besoin d'un autojointure:

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' 
+0

Dans Access ce produit une table qui contient les colonnes correctes, mais les deux lang_a et les colonnes lang_b contiennent le même texte de langue (lang_a). Il affiche deux fois la même lang_a de chaque enregistrement. Je me rends compte que cela viole la condition WHERE, mais c'est ce que je reçois. (suite) –

+0

(suite) L'ajout de t1.lang et de t2.lang à la sélection indique les ID de langue corrects. Je suis allé sur cela plusieurs fois, mais je n'ai pas été en mesure de comprendre le problème. –

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'; 

où "table" est tout le tableau ci sont en

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 
Questions connexes