SQL-запрос объединения для группировки по полю и проецирования в плоский набор результатов - PullRequest
3 голосов
/ 09 декабря 2011

Я пытаюсь написать запрос, который будет извлекать записи из одной и той же таблицы с различными условиями и представлять результаты в сжатом формате, как показано ниже:

Желаемый результат

ID, Word, Translation_From_Region_1007, Translation_From_Region_1006

1, Word1, Тест 1, Тест 2

2, Word2, тест 3, тест 4

Ниже указан псевдокод для моего запроса, однако я не совсем уверен, как сгладить результаты, чтобы отобразить желаемый результат:

SELECT     Words.ID, Words.Word, Translation
FROM         Words  WHERE RegionId=1007
UNION 
SELECT     Words.ID, Words.Word, Translation
FROM         Words WHERE RegionId=1006

Group by Word (as I only want one instance of the word itself with its respective translations flattened.

Если кто-нибудь может дать мне какой-либо совет или предложить лучший способ сделать это, я был бы очень признателен.

Ответы [ 4 ]

3 голосов
/ 09 декабря 2011

Как насчет этого?

select word, max(Translation1006), max(Translation1007)
from
   (SELECT     
       words.word,
       Translation1006 = 
       CASE region
        when 1006 THEN trans
        else NULL
    END,  
    Translation1007 =
    CASE region
        when 1007 THEN trans
        else NULL
    END
    FROM
       words) as detail
group by word
2 голосов
/ 09 декабря 2011

Если вы используете SQL Server, вы можете фактически сгладить перевод, поместив запятую между каждой записью перевода, вот так.

SELECT Main.ID, Main.Word, Main.Translations 
FROM(SELECT distinct Words2.ID, Words2.Word,
       (SELECT Words1.Translation + ',' AS [text()]
        FROM WORDS Words1
        WHERE Words1.ID = Words2.ID
        AND Words1.RegionId in (1007, 1006)
        ORDER BY Words1.ID
        For XML PATH ('')) [Translations]
FROM WORDS Words2) [Main]

Другой простой пример этого можно найти с помощью вопроса переполнения стека:

Объединить много строк в одну текстовую строку?

В качестве альтернативы, вы можете найти множество примеров этого в Oracle здесь:

http://www.dba -oracle.com / t_display_multiple_column_values_same_rows.htm

2 голосов
/ 09 декабря 2011

Как насчет этого?

select A.ID, A.Word, Trans1007 = A.Translation, Trans1006 = B.Translation
    from WORDS A
    left outer join WORDS B on A.ID = B.ID and B.RegionId = 1006
    where A.RegionId = 1007
union
select B.ID, B.Word, Trans1007 = A.Translation, Trans1006 = B.Translation
    from WORDS B
    left outer join WORDS A on B.ID = A.ID and A.RegionId = 1007
    where B.RegionId = 1006

или вы можете поворачиваться аналогично этому (что будет лучше, если у вас будет более двух регионов, по которым вы бы хотели запросить) ...

select ID, Word, [1006] as T_1006, [1007] as T_1007
    from (select Id, Word, RegionId, Translation from WORD where RegionId in (1006, 1007)) w
    pivot (
        max(Translation)
        for RegionId in([1006], [1007])
        ) as pvt
0 голосов
/ 09 декабря 2011
    SELECT distinct Words.ID, Words.Word, Translation
    FROM Words  
    WHERE RegionId=1007 or RegionId=1006
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...