2015-09-29 36 views
1

我是SQL Server 2012的新手。这是我的表DDL & DML脚本。如何使用SQL Server 2012中的聚合函数按组检索数据

CREATE TABLE [tbl_item_i18n] 
(
    [item_id] [int] NOT NULL, 
    [lang_id] [int] NOT NULL, 
    [item_text] [nvarchar](max) NULL 
); 

INSERT INTO [tbl_item_i18n] ([item_id],[lang_id],[item_text]) 
VALUES (1, 1, 'item1'), (1, 2, 'idem 1'), 
     (2, 1, 'item2'), 
     (3, 1, 'item3'), (3, 2, 'idem 3'), 
     (4, 1, 'item4'), (4, 2, 'idem 4'); 

我的预期成果是:

enter image description here

这是我曾尝试:

select 
    lang_id, 
    case when lang_id = 2 AND itemI18N.item_text is not null then itemI18N.item_text 
     when lang_id = 1 then itemI18N.item_text 
    end as ite_texte 
from 
    tbl_item_i18n itemI18N 
group by 
    itemI18N.item_id, lang_id, itemI18N.item_text 

但它并没有给我预期的结果。

目的: - 我想检索lang_id = 2的数据。如果lang_id = 2的记录不存在,则检索lang_id = 2的数据。
如何使用聚合函数检索数据?

+0

ITEM_NAME你想要什么?第一?持续?请解释你的愿望输出的逻辑是什么。 –

+0

那么为每个'item_id'选择'item_name'的规则是什么? –

+0

请考虑更新的问题。 (目的) – unknown

回答

0

LEFT JOIN将所有的柱lenguaje 1,和空,如果不必须lenguaje 2.

我有额外的列,所以你懂的结果。

SELECT 
    item_id, 
    CASE 
     WHEN B.lang_id IS NULL THEN A.item_text 
     ELSE B.item_text 
    END as item_name, 
    A.* 
    B.* 
FROM tbl_item_i18n A 
LEFT JOIN tbl_item_i18n B 
    ON A.item_id = B.item_id 
    AND A.lang_id < B.lang_id 

注意

如果超过2个lenguajes也许需要特殊考虑。

另一种解决方案

SELECT * 
FROM 
    (
    SELECT item_id, lang_id, item_text as item_name, 
      ROW_NUMBER() over (partition by item_id order by lang_id desc) as RN 
    FROM tbl_item_i18n 
) as t 
WHERE RN = 1 
+0

有没有其他方式没有使用'left join',因为它只是一个简单的查询。我有非常非常复杂的查询。所以如果我使用左连接,那么会出现性能问题。 – unknown

+0

让我考虑一下,但是如果你有适当的'item_id'和'lenguaje_id'索引,不应该有性能问题。这是非常简单的查询。 –

+0

这种复杂的查询用于报表。单个查询中有近25个表格。如果我使用左连接,那么它将成为50个表连接。所以它会降低查询的性能。 – unknown