簡體   English   中英

按記錄計數每個前5個組的首要項目(Access SQL)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM