【发布时间】: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 列的汇总不起作用。
关于如何根据需要获取查询输出的任何建议?
感谢您的宝贵时间和洞察力。
【问题讨论】:
标签: sql