查询没有重复和聚合函数或 GROUP BY 子句问题。 - 重复
Posted
技术标签:
【中文标题】查询没有重复和聚合函数或 GROUP BY 子句问题。 - 重复【英文标题】:Query without duplicates & aggregate function or the GROUP BY clause issue. - REPEX 【发布时间】:2021-07-15 22:12:03 【问题描述】:我的背景是 R,我使用 SQL 处理简单的大查询,后来我用 R 改进了这些查询,因此为我的迂腐道歉。
我正在运行简单的 Azure SQL 数据库进行测试,我正在进入 SQL 优化以确保我只将必要的数据提取到 R 中。
db 的样例表如下:
-- Create a sample table:
CREATE TABLE distinct_repex
(
invoice_num INT,
invoice_suffix INT,
company_name VARCHAR(32),
invoice_amt DECIMAL
);
-- Sample Data for the Table:
INSERT INTO distinct_repex(invoice_num, invoice_suffix, company_name, invoice_amt)
VALUES
('1234', '1', 'Saul Goodman LLC','1001'),
('1234', '2', 'Saul Goodman LLC','1001'),
('1234', '3', 'Saul Goodman LLC','1001'),
('2234', '1', 'Saul Badman LLC','1002'),
('2234', '2', 'Saul Badman LLC','1002'),
('3234', '1', 'Saul Goodman LLC','1003'),
('4234', '1', 'Saul Goodman LLC','1004'),
('4234', '1', 'Saul Goodman LLC','1004'),
('4234', '2', 'Saul Goodman LLC','1004'),
('4234', '3', 'Saul Goodman LLC','1004'),
('5234', '1', 'Ax-Capital LLC','1005'),
('5234', '1', 'Ax-Capital LLC','1005'),
('5234', '2', 'Ax-Capital LLC','1005'),
('5234', '3', 'Ax-Capital LLC','1005');
如上所示,有不同后缀的重复发票编号,其中一些是重复的(即:发票 4234 有两个 1 后缀)
我正在尝试使用公司名称和 invoice_amt 查询所有 UNIQUE (invoice_num & invoice_suffix) 对。
一开始我试过:
SELECT
dbo.distinct_repex.invoice_num,
dbo.distinct_repex.invoice_suffix
FROM
dbo.distinct_repex
GROUP BY
dbo.distinct_repex.invoice_num,
dbo.distinct_repex.invoice_suffix
HAVING
COUNT(invoice_num) = 1
ORDER BY
dbo.distinct_repex.invoice_num;
这让我得到了以下信息:
1234 1
1234 2
1234 3
2234 1
2234 2
3234 1
4234 2
4234 3
5234 2
5234 3
我注意到我实际上没有为发票 4234 后缀 1 和发票 5234 后缀 1 捕获任何重复的 invoice_num 和 invoice_suffix 对,这两个发票都有重复的值,我试图只带回每个发票中的一个,但我我什么都没有。
另一个问题是我不熟悉如何在给定 GROUP BY 的情况下提取相关信息,例如(不工作):
SELECT
dbo.distinct_repex.invoice_num,
dbo.distinct_repex.invoice_suffix
dbo.distinct_repex.invoice_amt
dbo.distinct_repex.company_name
FROM
dbo.distinct_repex
GROUP BY
dbo.distinct_repex.invoice_num,
dbo.distinct_repex.invoice_suffix
HAVING
COUNT(invoice_num) = 1
ORDER BY
dbo.distinct_repex.invoice_num;
根据上述情况,我收到关于聚合函数的错误。
列“dbo.distinct_repex.invoice_amt”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
我真正想要得到的查询输出:
invoice_num | invoice_suffix | company_name | invoice_amt |
---|---|---|---|
1234 | 1 | Saul Goodman LLC | 1001 |
1234 | 2 | Saul Goodman LLC | 1001 |
1234 | 3 | Saul Goodman LLC | 1001 |
2234 | 1 | Saul Badman LLC | 1002 |
2234 | 2 | Saul Badman LLC | 1002 |
3234 | 1 | Saul Goodman LLC | 1003 |
4234 | 1 | Saul Goodman LLC | 1004 |
4234 | 2 | Saul Goodman LLC | 1004 |
4234 | 3 | Saul Goodman LLC | 1004 |
5234 | 1 | Ax-Capital LLC | 1005 |
5234 | 2 | Ax-Capital LLC | 1005 |
5234 | 3 | Ax-Capital LLC | 1005 |
在本例中,“invoice_amt”列代表发票的总金额,这就是为什么我只想在“删除”发票编号和后缀重复项后提供该信息。
既然我在这里,不妨问...如果 invoice_amt 列不是总计,我必须添加这些列并按上述所需输出进行汇总,但现在只有总计.
例如(想要的查询结果):
invoice_num | invoice_suffix | company_name | invoice_amt |
---|---|---|---|
1234 | 1 | Saul Goodman LLC | 3003 |
2234 | 1 | Saul Badman LLC | 2004 |
3234 | 1 | Saul Goodman LLC | 1003 |
4234 | 1 | Saul Goodman LLC | 3012 |
5234 | 1 | Ax-Capital LLC | 3015 |
我尝试了以下操作但无济于事:
-- GENERATE THE LIST HAVING 1 COUNT:
SELECT dbo.distinct_repex.invoice_num,
--dbo.distinct_repex.invoice_suffix,
sum(dbo.distinct_repex.invoice_amt) AS sum_inv_amt
--dbo.distinct_repex.company_name
FROM dbo.distinct_repex
GROUP BY dbo.distinct_repex.invoice_num,
dbo.distinct_repex.invoice_suffix
HAVING count(invoice_num) = 1
ORDER BY dbo.distinct_repex.invoice_num;
-- * company_name was commented out of the query because it wasn't working, left company_name and invoice_suffix commented out.
但我得到了这样的东西:
invoice_num | invoice_amt |
---|---|
1234 | 1001 |
1234 | 1001 |
1234 | 1001 |
2234 | 1002 |
2234 | 1002 |
3234 | 1003 |
4234 | 1004 |
4234 | 1004 |
5234 | 1005 |
5234 | 1005 |
和以前一样,由于聚合函数错误,我仍然无法带上公司名称等字段,更不用说 invoice_amt 列的汇总不起作用。
关于如何根据需要获取查询输出的任何建议?
感谢您的宝贵时间和洞察力。
【问题讨论】:
【参考方案1】:我正在尝试使用公司名称和 invoice_amt 查询所有 UNIQUE (invoice_num & invoice_suffix) 对。
我将此解释为您希望所有对在表中只出现一次。如果是这样,一个简单的方法是:
SELECT r.invoice_num, r.invoice_suffix,
MAX(r.company_name) as company_name,
MAX(r.invoice_amt) asinvoice_amt
FROM dbo.distinct_repex r
GROUP BY r.invoice_num, r.invoice_suffix
HAVING COUNT(*) = 1
ORDER BY r.invoice_num;
如果您确实希望所有对只出现一次,那么您可以删除 HAVING
子句。
如果COUNT(*) = 1
,则MAX()
返回一个值。需要聚合函数,但MAX()
或MIN()
都可以。
也不能使用表别名。这使查询更易于编写和阅读。
【讨论】:
看起来像 COUN(*) 上的一个小错字?另外,行本身不是必需的吗,因为无论如何我们都是按重复的行分组的?否则,这似乎是一个很好的答案。 @gordon,请回答。我不清楚这些聚合函数在处理文本时是如何工作的。您提出的建议有效,我可以对其进行调整以提供我希望的内容,但我仍然不太了解聚合功能....根据您之前的示例,我推断SELECT MAX(r.company_name) as company_name FROM dbo.distinct_repex r
只会带来“独特的”(真正意义上的)公司名称,但事实并非如此。你介意解释一下为什么我认为不正确吗?
@Technobrat 。 . . MAX()
和 MIN()
几乎适用于任何数据类型。如果您想了解更多信息,可以调查排序规则。以上是关于查询没有重复和聚合函数或 GROUP BY 子句问题。 - 重复的主要内容,如果未能解决你的问题,请参考以下文章
列在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。[ntext] [重复]