1

我有一张包含一些术语的表格。这些术语有多种语言。例如:

SELECT *
FROM Terminology

结果是

ID   language          text        create_date
1       DE          TextDE  2011-03-03 14:31:28.423
1       EN          TextEN  2011-04-03 14:32:27.423
1       ES          TextES  2011-05-03 14:33:26.423
1       FR          TextFR  2011-06-03 14:34:25.423
1       NL          TextNL  2011-07-03 14:35:24.423
1       PT          TextPT  2011-08-03 14:36:23.423
2       DE                 ...
...

但我需要以下形式的数据:

ID  DE     EN     ES     FR     NL     PT
1 TextDE TextEN TextES TextFR TEXTNL TextPT
2 ...

ID并且language正在构建主键。语言的数量是可变的,因此不可能只添加 6 个额外的列。

是否有可能通过普通的 SQL 查询来完成这项工作,或者我是否必须在我的程序中对其进行排序?

编辑:
表中的一列未选中,但具有不同的值,我得到几行。
因此,就像在具有 6 个不同日期的示例中一样,我得到 6 个不同的行:

ID          DE         EN         ES         FR         NL         PT

1   TextDE            NULL       NULL       NULL       NULL       NULL
1   NULL              TextEN     NULL       NULL       NULL       NULL
1   NULL              NULL       TextES     NULL       NULL       NULL
1   NULL    NULL    NULL    TextFr NULL NULL    NULL
...

我能以某种方式把它变成一排吗?

4

2 回答 2

3

试试这个——

IF OBJECT_ID (N'tempdb.dbo.#temp') IS NOT NULL
   DROP TABLE #temp

CREATE TABLE #temp (
      ID INT
    , [language] CHAR(2)
    , [text] VARCHAR(10)
    , create_date DATETIME
)
INSERT INTO #temp (ID, [language], [text], create_date)
VALUES 
    (1, 'DE', 'TextDE', '2011-03-03 14:31:28.423'),
    (1, 'EN', 'TextEN', '2011-04-03 14:32:27.423'),
    (1, 'ES', 'TextES', '2011-05-03 14:33:26.423'),
    (1, 'FR', 'TextFR', '2011-06-03 14:34:25.423'),
    (1, 'NL', 'TextNL', '2011-07-03 14:35:24.423'),
    (1, 'PT', 'TextPT', '2011-08-03 14:36:23.423'),
    (2, 'PT', 'TextPT', NULL)

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = '
    SELECT ID, DE, EN, ES, FR, NL, PT
    FROM (
        SELECT ID, [language], [text]
        FROM #temp
    ) t
    PIVOT (
        MAX([text]) 
        FOR [language] IN (' + 
        STUFF((
            SELECT DISTINCT ', [' + t.[language] + ']'
            FROM #temp t
            FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 2, '') + ')
    ) pv'

PRINT @SQL
EXEC sys.sp_executesql @SQL

输出 -

ID          DE         EN         ES         FR         NL         PT
----------- ---------- ---------- ---------- ---------- ---------- ----------
1           TextDE     TextEN     TextES     TextFR     TextNL     TextPT
2           NULL       NULL       NULL       NULL       NULL       TextPT
于 2013-08-14T07:28:02.157 回答
1

在 SQL Server 中没有简单的方法可以做到这一点,请参阅此答案以获得一般解决方案 - https://stackoverflow.com/a/13583258/1744834

对于少量列,您可以执行以下操作:

select
    ID,
    max(case when language = 'DE' then text else null end) as TextDE,
    max(case when language = 'EN' then text else null end) as TextEN,
    ...
from Terminology
group by ID
于 2013-08-14T07:27:02.953 回答