【问题标题】:How to retrieve data with group by aggregate function in SQL Server 2012如何在 SQL Server 2012 中使用按聚合函数分组检索数据
【发布时间】:2023-03-11 16:58:01
【问题描述】:

我是 SQL Server 2012 的新手。这是我的表 DDL 和 DML 脚本。

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

我的预期输出是:

这是我尝试过的:

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 的数据。
如何使用聚合函数检索数据?

【问题讨论】:

  • 你想要什么item_name?第一的?最后的?请解释您的期望输出的逻辑是什么。
  • 那么item_name为每个item_id选择的规则是什么?
  • 请考虑更新的问题。 (目的)
  • 我认为您的架构错误(反向)。因为看起来item_id 应该是第一列,lenguaje_id 应该是第二列?
  • 您说“如果 lang_id = 2 的记录不存在,则检索 lang_id = 2 的数据。”。其中一个应该说 lang_id= 1 - 哪个?

标签: sql sql-server-2012 group-by aggregate-functions


【解决方案1】:

LEFT JOIN 将所有列带 lenguaje 1,如果没有 lenguaje 2,则返回 null。

我添加了额外的列,以便您了解结果。

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

【讨论】:

  • 不使用left join有没有其他方法,因为它只是一个简单的查询。我有非常非常复杂的查询。因此,如果我使用左连接,则会出现性能问题。
  • 让我考虑一下,但是如果你有item_idlenguaje_id 的正确索引,应该不会有性能问题这是非常简单的查询。
  • 报表中使用了这种复杂的查询。单个查询中有近 25 个表。如果我使用左连接,那么它将变成 50 个表连接。所以它会降低查询的性能。
  • 我提供了另一个解决方案,在这种情况下会给你带来leng_id的最高记录。但是,如果添加 JOIN 会影响您的性能,那么您可能会遇到不同的问题。可能需要添加额外的索引
猜你喜欢
  • 2015-12-29
  • 2020-06-08
  • 2014-12-26
  • 2021-12-02
  • 2017-01-29
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多