MariaDB предлагает «оконные функции», которые можно использовать для этого, я полагаю (также ссылаясь на предыдущий вопрос, который, кажется, требует только подсчета от «трех лучших» агентов):
CREATE TABLE bsn_kode_agent(
kodeagent VARCHAR(10) NOT NULL PRIMARY KEY
,fungsi VARCHAR(40) NOT NULL
);
INSERT INTO bsn_kode_agent(kodeagent,fungsi)
VALUES
('a','sales agent')
, ('b','sales agent');
CREATE TABLE bsn_data(
kodeagent VARCHAR(1) NOT NULL
,kodeupline2 VARCHAR(2) NOT NULL
,periode DATE NOT NULL
);
INSERT INTO bsn_data(kodeagent,kodeupline2,periode)
VALUES
('a','b1','2018-12-01')
, ('a','b1','2018-12-01')
, ('a','b1','2018-12-01')
, ('a','c1','2018-12-01')
, ('a','c1','2018-12-01')
, ('a','c1','2018-12-01')
, ('a','d1','2018-12-01')
, ('a','d1','2018-12-01')
, ('a','e1','2018-12-01')
, ('a','f1','2018-12-01')
;
SELECT
b.kodeagent
, IFNULL( SUM( d.total ), 0 ) AS totps
FROM bsn_kode_agent AS b
LEFT JOIN (
SELECT
tableb.kodeupline2
, tableb.kodeagent
, tableb.total
, ROW_NUMBER() OVER (PARTITION BY tableb.kodeagent
ORDER BY tableb.total DESC) as rn
FROM (
SELECT
bsn_data.kodeupline2
, bsn_data.kodeagent
, COUNT( 1 ) total
FROM bsn_data
WHERE bsn_data.periode >= '2018-12-01'
AND bsn_data.periode < '2018-12-01' + INTERVAL 1 MONTH
GROUP BY
bsn_data.kodeupline2
, bsn_data.kodeagent
) AS tableb
) d ON d.kodeagent = b.kodeagent and d.rn <=3
WHERE b.fungsi = 'sales agent'
group by
b.kodeagent
ORDER BY
totps DESC
kodeagent | totps
:-------- | ----:
a | 8
b | 0
Ниже: Результат подзапроса, еслизапустить автономно.Обратите внимание, что в столбце rn
возможна последующая фильтрация только агентов с наибольшим числом.
SELECT
tableb.kodeupline2
, tableb.kodeagent
, tableb.total
, ROW_NUMBER() OVER (PARTITION BY tableb.kodeagent
ORDER BY tableb.total DESC) as rn
FROM (
SELECT
bsn_data.kodeupline2
, bsn_data.kodeagent
, COUNT( 1 ) total
FROM bsn_data
WHERE bsn_data.periode >= '2018-12-01'
AND bsn_data.periode < '2018-12-01' + INTERVAL 1 MONTH
GROUP BY
bsn_data.kodeupline2
, bsn_data.kodeagent
) AS tableb
kodeupline2 | kodeagent | total | rn
:---------- | :-------- | ----: | -:
b1 | a | 3 | 1
c1 | a | 3 | 2
d1 | a | 2 | 3
e1 | a | 1 | 4
f1 | a | 1 | 5
db <> fiddle здесь
Обратите также внимание на то, насколько полезно иметь некоторые данные выборки, НО , поскольку этого не было. Возможно, я сделал неверные предположения относительно образца, показанного здесь - этоВСЕГДА лучше, если данные для примера поставляются с вопросом.