Groupin Clients, когда клиент новый в году ORACLE - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть список счетов. Я хочу сгруппировать данные в sales_departments, но только у тех клиентов, у которых первый счет был выставлен в 2018 году.

Ниже моих "данных". Извините за мистику, но я не могу вставить данные лучше.

Client_Number    sales_depart   Netto   Number_Invoice  Invoice_Date
1022562          0140           113     51545121188     04.11.18
1022562          0140           139     5586258568      04.01.18
1022564          0140           171     5586713889      03.22.18
1022565          0140           211     5587169210      03.22.17
1022566          0140           259     5587624531      03.22.16
1022567          0140           319     5588079852      03.23.15
1022568          0140           392     5588535173      03.23.14
1022569          0140           483     5588990494      03.23.13
1022570          0140           594     5589445815      03.23.12
1022571          0140           730     5589901136      03.24.11
1008144          0530           898     5590356457      01.31.18
1008145          0530           104     5590811778      02.20.18
1008146          0530           358     5591267099      02.20.17
1008147          0530           671     5591722420      02.21.16
1008148          0530           055     5592177741      02.21.15
1008149          0530           528     5592633062      02.21.14
1008150          0530           109     5593088383      02.21.13
1016058          0130           825     5593543704      01.18.18
1051643          0290           704     5593999025      01.30.18
1051643          0290           175     5595199025      01.30.17
1049433          0180           786     5594454346      02.20.18
1010219          0180           117     5594909667      02.28.18
1033233          0180           754     5595364988      02.28.18
1004914          0160           767     5595820309      02.14.18
1011699          0140           244     5596275630      02.20.18
1007323          0160           290     5596730951      04.19.18
1004914          0160           036     5597186272      02.07.18
1005837          0530           645     5597641593      04.19.18

Это ответ на этот вопрос.

Sales Department COUNT(DISTINCT Clint_Nuber) 0130 1 0160 2 0180 3

Ответы [ 4 ]

0 голосов
/ 25 апреля 2018

Вот решение вашей проблемы:

SELECT sales_depart, COUNT(Distinct client_Number) AS Distinct_Clients
FROM Table1
GROUP BY sales_depart
HAVING MIN(TO_DATE(invoice_date, 'MM.DD.YY')) >= TO_DATE('01-01-2018', 'DD-MM-YYYY')
ORDER BY sales_depart

ВЫВОД:

SALES_DEPART    DISTINCT_CLIENTS
0130                1
0160                2
0180                3

Примечание: Так как Client_Number = 1004914 повторяется 2 раза в Sales_depart = 0160, поэтому он учитывается только 1 раз.

Ссылка на демо:

http://sqlfiddle.com/#!4/28c71/1

0 голосов
/ 25 апреля 2018
SELECT sd.sales_depart,COUNT(sd.Client_Number) AS Client_Number
FROM sales_departments sd
INNER JOIN
(
SELECT sales_depart,MIN(Invoice_Date) AS Invoice_Date
FROM sales_departments
WHERE Invoice_date >= DATE '2018-01-01'
GROUP BY sales_depart
) T
ON T.sales_depart=sd.sales_depart
GROUP BY sd.sales_depart
0 голосов
/ 25 апреля 2018

Это можно сделать с помощью сканирования одной таблицы с помощью предложения HAVING:

SQL Fiddle

Настройка схемы Oracle 11g R2 :

CREATE TABLE table_name ( Client_Number, sales_depart, Netto, Number_Invoice, Invoice_Date ) AS
SELECT 1022562, '0140', 113, 51545121188, DATE '2018-04-11' FROM DUAL UNION ALL
SELECT 1022562, '0140', 139, 5586258568, DATE '2018-04-01' FROM DUAL UNION ALL
SELECT 1022564, '0140', 171, 5586713889, DATE '2018-03-22' FROM DUAL UNION ALL
SELECT 1022565, '0140', 211, 5587169210, DATE '2017-03-22' FROM DUAL UNION ALL
SELECT 1022566, '0140', 259, 5587624531, DATE '2016-03-22' FROM DUAL UNION ALL
SELECT 1022567, '0140', 319, 5588079852, DATE '2015-03-23' FROM DUAL UNION ALL
SELECT 1022568, '0140', 392, 5588535173, DATE '2014-03-23' FROM DUAL UNION ALL
SELECT 1022569, '0140', 483, 5588990494, DATE '2013-03-23' FROM DUAL UNION ALL
SELECT 1022570, '0140', 594, 5589445815, DATE '2012-03-23' FROM DUAL UNION ALL
SELECT 1022571, '0140', 730, 5589901136, DATE '2011-03-24' FROM DUAL UNION ALL
SELECT 1008144, '0530', 898, 5590356457, DATE '2018-01-31' FROM DUAL UNION ALL
SELECT 1008145, '0530', 104, 5590811778, DATE '2018-02-20' FROM DUAL UNION ALL
SELECT 1008146, '0530', 358, 5591267099, DATE '2017-02-20' FROM DUAL UNION ALL
SELECT 1008147, '0530', 671, 5591722420, DATE '2016-02-21' FROM DUAL UNION ALL
SELECT 1008148, '0530', 055, 5592177741, DATE '2015-02-21' FROM DUAL UNION ALL
SELECT 1008149, '0530', 528, 5592633062, DATE '2014-02-21' FROM DUAL UNION ALL
SELECT 1008150, '0530', 109, 5593088383, DATE '2013-02-21' FROM DUAL UNION ALL
SELECT 1016058, '0130', 825, 5593543704, DATE '2018-01-18' FROM DUAL UNION ALL
SELECT 1051643, '0290', 704, 5593999025, DATE '2018-01-30' FROM DUAL UNION ALL
SELECT 1051643, '0290', 175, 5595199025, DATE '2017-01-30' FROM DUAL UNION ALL
SELECT 1049433, '0180', 786, 5594454346, DATE '2018-02-20' FROM DUAL UNION ALL
SELECT 1010219, '0180', 117, 5594909667, DATE '2018-02-28' FROM DUAL UNION ALL
SELECT 1033233, '0180', 754, 5595364988, DATE '2018-02-28' FROM DUAL UNION ALL
SELECT 1004914, '0160', 767, 5595820309, DATE '2018-02-14' FROM DUAL UNION ALL
SELECT 1011699, '0140', 244, 5596275630, DATE '2018-02-20' FROM DUAL UNION ALL
SELECT 1007323, '0160', 290, 5596730951, DATE '2018-04-19' FROM DUAL UNION ALL
SELECT 1004914, '0160', 036, 5597186272, DATE '2018-02-07' FROM DUAL UNION ALL
SELECT 1005837, '0530', 645, 5597641593, DATE '2018-04-19' FROM DUAL;

Запрос 1 :

SELECT sales_depart,
       COUNT( client_number )
FROM   (
  SELECT sales_depart,
         client_number
  FROM   table_name
  GROUP BY
         sales_depart,
         client_number 
  HAVING MIN( Invoice_date ) >= DATE '2018-01-01'
)
GROUP BY sales_depart

Результаты :

| SALES_DEPART | COUNT(CLIENT_NUMBER) |
|--------------|----------------------|
|         0140 |                    3 |
|         0530 |                    3 |
|         0180 |                    3 |
|         0130 |                    1 |
|         0160 |                    2 |
0 голосов
/ 25 апреля 2018

Один метод использует not exists для фильтрации:

select sales_department, sum(netto)
from t
where not exists (select 1
                  from t t2
                  where t2.client = t.client and
                        t2.invoice_date < date '2018-01-01'
                 )
group by sales_department;

Для производительности вам нужен индекс на (client, invoice_date). Также нельзя использовать ключевое слово date для определения константы с использованием стандартных форматов ISO / ANSI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...