[英]Top item for each top 5 group by record count (Access SQL)
我有一個大表Audit
有數千條被拒絕的索賠記錄。 每個人都來自供應商,並有拒絕理由和地位。 只有id
是唯一的。
id | denial | supplier | status
---|------------------|---------------|---------
1 | Duplicate claim | ACME | Adjusted
2 | Not authorized | Umbrella Corp | Adjusted
3 | Not authorized | Stark Ind. | Adjusted
4 | Rec'd after due | ACME | Override
5 | Duplicate claim | Stark Ind. | Adjusted
... etc
我需要的是按記錄計數“調整”狀態聲明的前5個拒絕原因,以及每個拒絕原因的最高提供者記錄計數。
denial | cnt_denial | top_supplier | cnt_top_supplier
----------------|------------|---------------|-----------------
Not authorized | 917 | Stark Ind. | 351
Duplicate claim | 685 | Stark Ind. | 195
Not in contract | 525 | ACME | 216
Rec'd after due | 512 | Umbrella Corp | 500
Explosions | 349 | ACME | 231
我已經嘗試了很多方法,主要是嘗試適應其他類似的解決方案,但我在這里超越了我微薄的SQL知識而感到沮喪。 我嘗試過的幾種解決方案在MS Access(2010)中不起作用。 我創建了兩個查詢作為開始,但我無法以我需要的方式加入它們。
此查詢完全返回我需要的拒絕原因數據:
SELECT TOP 5 denial, Count(*) AS cnt_denial
FROM Audit
GROUP BY status, denial
HAVING status="Adjusted"
ORDER BY Count(*) DESC;
此查詢包含表中每個拒絕/供應商分組的計數。 我不確定如何獲得每個拒絕原因的頂級供應商,這似乎應該很簡單,但我遇到了麻煩。 編輯:這是我的主要問題。 如果我能夠獲得每個拒絕原因的頂級單一供應商,我可以找出加入。 我嘗試過使用MAX但還沒有成功。 /編輯
SELECT denial, supplier, Count(*) AS cnt_supplier
FROM Audit
GROUP BY denial, supplier, status
HAVING status="Adjusted"
ORDER BY Count(*) DESC;
我需要一個查詢,因為我只是通過ADO從Excel傳遞此信息。 任何幫助將非常感激。
我不知道這是否是完全有效的Access SQL。 如果不是這樣,它不應該需要很多調整:
select
d.denial,
d.cnt_denial,
ds.supplier as top_supplier,
ds.cnt_supplier as cnt_top_supplier
from
(
select top 5 denial, count(*) as cnt_denial
from Audit
where status = 'Adjusted'
group by denial
order by count(*) desc
) d
inner join
(
select denial, supplier, count(*) as cnt_supplier
from Audit
where status = 'Adjusted'
group by denial, supplier
) ds
on ds.denial = d.denial
where not exists (
select 1
from Audit as a2
where a2.status = 'Adjusted'
and a2.denial = ds.denial and a2.supplier <> ds.supplier
group by a2.supplier
having count(*) > ds.cnt_supplier
/* or count(*) = ds.cnt_supplier and a2.supplier < ds.supplier -- tiebreaker */
)
order by d.cnt_denial desc, ds.supplier
通過使用top 5
,不管領帶如何,它只能抓住五行。 然后使用子查詢處理每個組的前1個,在這種情況下,您將包含tie並可能在最終結果中檢索超過5行。 如果您需要或在供應商排名中打破關系並將其排除,那么在拒絕級別包含關系並不太困難。
編輯:我把一些測試數據匯總在一起,打破平局似乎適用於SQL Server。 http://rextester.com/ZEWJ43486
看起來你已經完成了所有艱苦的工作。
一種解決方案是在第二個查詢中測試拒絕原因
將您的第一個查詢保存為qTop5Reasons
SELECT TOP 5 denial, Count(*) AS cnt_denial
FROM Audit
GROUP BY status, denial
HAVING status="Adjusted"
ORDER BY Count(*) DESC;
修改第二個查詢以根據該查詢中的原因限制結果:
SELECT Audit.denial, Audit.supplier, Count(*) AS cnt_supplier
FROM Audit
WHERE (Audit.denial In (SELECT denial FROM qTop5Reasons))
GROUP BY Audit.denial, Audit.supplier, Audit.status
HAVING (((Audit.[status])="Adjusted"))
ORDER BY Count(*) DESC;
你應該嘗試內聯。 嘗試這個
SELECT A.DENIAL, A.Cnt_Denial,B.Supplier as TOP_SUPPLIER, B.Cnt_supplier as
TOP_CNT_SUPPLIER
FROM
(SELECT TOP 5 denial, Count(*) AS cnt_denial
FROM Audit
GROUP BY status, denial
HAVING status="Adjusted"
ORDER BY Count(*) DESC) AS A INNER JOIN
(SELECT TOP 5 denial, supplier, Count(*) AS cnt_supplier
FROM Audit
GROUP BY denial, supplier, status
HAVING status="Adjusted"
ORDER BY Count(*) DESC) AS B
ON A.DENIAL = B.DENIAL
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.