Как исправить запрос, чтобы отобразить результаты? - PullRequest
0 голосов
/ 16 января 2019

У меня есть несколько таблиц, к которым я хочу присоединиться, чтобы получить сумму отдельного столбца из всех них. Мой пример структуры таблицы приведен ниже.

Клиенты КАК

+---+-------+------------+--------+----------+
|id | name  | profile_id |  grp   | end_date |
+---+-------+------------+--------+----------+
| 1 | cust1 |     7      |   ae   |   (null) |
+---+-------+------------+--------+----------+
| 2 | cust2 |     2      |   bz   |  (null)  |
+---+-------+------------+--------+----------+
| 3 | cust2 |     2      |   cc   | not_null |
+---+-------+------------+--------+----------+

Профили AS B

+---+-------------------+
|id | profile_name      |
+---+-------------------+
| 2 | pro_cust1         |
+---+-------------------+
| 7 | pro_cust2         |
+---+-------------------+

Счета AS C

+---+------------------+----------------+----------------+
|id | reference        | scandate       |  customer_id   |
+---+------------------+----------------+----------------+
| 1 | test_SOMETHING1  |  (today)       |   2            |
+---+------------------+----------------+----------------+
| 2 | test_2           |  (today)       |   2            |
+---+------------------+----------------+----------------+
| 3 | test_SOMETHING2  |  (not_today)   |   2            |
+---+------------------+----------------+----------------+
| 4 | test_SOMETHING3  |  (today)       |   1            |
+---+------------------+----------------+----------------+
| 5 | test_3           |  (today)       |   2            |
+---+------------------+----------------+----------------+
| 6 | test_SOMETHING4  |  (not_today)   |   1            |
+---+------------------+----------------+----------------+

Invoice_s_errors AS D

+---+------------------+----------------+----------------+
|id | reference        | scandate       |  customer_id   |
+---+------------------+----------------+----------------+
| 1 | tst_SOMETHING1   |  (today)       |   1            |
+---+------------------+----------------+----------------+
| 2 | tst_2            |  (today)       |   2            |
+---+------------------+----------------+----------------+
| 3 | tst_SOMETHING2   |  (not_today)   |   1            |
+---+------------------+----------------+----------------+
| 4 | tst_SOMETHING3   |  (today)       |   1            |
+---+------------------+----------------+----------------+
| 5 | tst_3            |  (today)       |   2            |
+---+------------------+----------------+----------------+
| 6 | tst_SOMETHING4   |  (not_today)   |   1            |
+---+------------------+----------------+----------------+

Invoice_fail AS E

+---+------------------+----------------+----------------+
|id | reference        | scandate       |  customer_id   |
+---+------------------+----------------+----------------+
| 1 | ttt_SOMETHING1   |  (today)       |   2            |
+---+------------------+----------------+----------------+
| 2 | ttt_2            |  (today)       |   1            |
+---+------------------+----------------+----------------+
| 3 | ttt_SOMETHING2   |  (not_today)   |   2            |
+---+------------------+----------------+----------------+
| 4 | ttt_SOMETHING3   |  (today)       |   2            |
+---+------------------+----------------+----------------+
| 5 | ttt_3            |  (today)       |   1            |
+---+------------------+----------------+----------------+
| 6 | ttt_SOMETHING4   |  (not_today)   |   2            |
+---+------------------+----------------+----------------+

Выход:

+---------+---------------+--------+--------+ 
| customer+ profile       |  group | Total  |
+---------+---------------+--------+--------+
| cust1   |   pro_cust1   |   ae   |   2    | 
+---------+---------------+--------+--------+
| cust2   |   pro_cust2   |   bz   |   3    |
+---------+---------------+--------+--------+

Ниже мой код, который возвращает данные не найдены. Что я делаю не так?

SELECT 
     A.name as customer
    ,B.profile_name as profile
    ,A.grp as "Group"
    ,count(distinct C.reference) + count(distinct D.reference) + count(distinct E.reference) as "Total"
FROM 
    customers A 
INNER JOIN 
    profiles B 
ON 
    A.profile_id = B.id 
INNER JOIN 
        invoices C
ON 
        A.id = C.customer_id 
INNER JOIN 
        invoice_s_errors D
ON 
        A.id = D.customer_id 
INNER JOIN
        invoice_fail E
ON
        A.id = E.customer_id 
WHERE 
    A.end_date IS NULL
AND
        (upper(C.reference) NOT LIKE ('%SOMETHING%') AND trunc(C.scandate) = trunc(sysdate))
AND
        (upper(D.reference) NOT LIKE ('%SOMETHING%') AND trunc(D.scandate) = trunc(sysdate))
AND
        (upper(E.reference) NOT LIKE ('%SOMETHING%') AND trunc(E.scandate) = trunc(sysdate))
GROUP BY A.name, A.grp, B.profile_name ORDER BY A.name ASC

1 Ответ

0 голосов
/ 16 января 2019

Это ваши данные, и потому, что вы ВНУТРЕННЕЕ присоединяйтесь к ним.

Индексы, которые имеют «ссылку» без «ЧТО-ТО» в псевдониме таблицы E, отличаются от таковых в C & D

Так что перейдите на левое соединение.

А затем поместите некоторые критерии, которые сейчас в ГДЕ, в СОЕДИНЕНИЯ.
В противном случае они все равно будут действовать как ВНУТРЕННИЕ СОЕДИНЕНИЯ.

SELECT 
 cust.name AS customer
,prof.profile_name AS profile
,cust.grp AS "Group"
,(COUNT(DISTINCT inv.reference) +
  COUNT(DISTINCT inverr.reference) +
  COUNT(DISTINCT invfail.reference)) AS "Total"
FROM customers cust
JOIN profiles prof ON prof.id = cust.profile_id
LEFT JOIN invoices inv 
  ON inv.customer_id = cust.id
 AND upper(inv.reference) NOT LIKE ('%SOMETHING%') 
 AND trunc(inv.scandate) = trunc(sysdate)
LEFT JOIN invoice_s_errors inverr 
  ON inverr.customer_id = cust.id
  AND upper(inverr.reference) NOT LIKE ('%SOMETHING%') 
  AND trunc(inverr.scandate) = trunc(sysdate)
LEFT JOIN invoice_fail invfail 
  ON invfail.customer_id = cust.id
 AND upper(invfail.reference) NOT LIKE ('%SOMETHING%') 
 AND trunc(invfail.scandate) = trunc(sysdate)
WHERE cust.end_date IS NULL          
GROUP BY cust.name, cust.grp, prof.profile_name 
ORDER BY cust.name ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...