Проблема с соединением SQL и группой - PullRequest
0 голосов
/ 19 октября 2019

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

У меня есть следующие таблицы:

Задания

| ID | JobNumber |
|----|-----------|
|  1 | J200      |
|  2 | J201      |

Job_Invoices

| ID | InvoiceNumber | JobID |
|----|---------------|-------|
| 10 |     I300      |   1   |
| 11 |     I301      |   2   |

Invoice_Accounts

| ID | InvoiceId | AccountID | Amount |
|----|-----------|-----------|--------|
| 23 |   10      |     40    |  200   |
| 24 |   10      |     40    |  300   |
| 25 |   10      |     41    |  100   |
| 26 |   11      |     40    |  100   |

Счета

| ID | Name |
|----|------|
| 40 | Sales|      
| 41 | EXP  |

Я пытаюсь сделать следующее:

SELECT  
    J.JobNumber,
    A.Name AS "Account",
    SUM(JA.Amount) AS 'Total'
FROM 
    Job J
LEFT JOIN 
    Job_Invoices JI ON JI.JobID = J.JobID
INNER JOIN 
    Invoice_Accounts JA ON JA.InvoiceId = JI.ID
INNER JOIN 
    Accounts A ON A.ID = JA.AccountID
GROUP BY 
    J.JobNumber, A.Name, JA.Amount
ORDER BY 
    J.JobNumber

Что я ожидаю:

| JobNumber | Account   | Total |
|-----------|-----------|-------|
| J200      |   EXP     |  100  |
| J200      |   Sales   |  500  |
| J201      |   Sales   |  100  |

Что я получу:

| JobNumber | Account   | Total |
|-----------|-----------|-------|
| J200      |   EXP     |  100  |
| J200      |   Sales   |  200  |
| J200      |   Sales   |  300  |
| J201      |   Sales   |  100  |

Ответы [ 3 ]

1 голос
/ 19 октября 2019

Вам не нужна таблица Job в запросе. INNER JOIN s относятся к таблице Job_Invoices, поэтому внешнее объединение в любом случае превращается во внутреннее объединение.

Итак, вы можете упростить это до:

SELECT JI.JobNumber, A.Name AS Account, SUM(JA.Amount) AS Total
FROM Job_Invoices JI JOIN
     Invoice_Accounts JA
     ON JA.InvoiceId = JI.ID JOIN
     Accounts A
     ON A.ID = JA.AccountID
GROUP BY JI.JobNumber, A.Name
ORDER BY JI.JobNumber;

Также обратите вниманиечто вам не нужно избегать псевдонимов столбцов. Это просто затрудняет ввод запроса.

1 голос
/ 19 октября 2019

Проблема в том, что в предложении GROUP BY есть JA.Amount. Попробуйте вынуть это:

    SELECT J.JobNumber, A.Name AS "Account", SUM(JA.Amount) AS 'Total'
    FROM Job J
    LEFT JOIN Job_Invoices JI ON JI.JobID = J.JobID
    INNER JOIN Invoice_Accounts JA ON JA.InvoiceId = JI.ID
    INNER JOIN Accounts A ON A.ID = JA.AccountID 
    GROUP BY J.JobNumber, A.Name
    ORDER BY J.JobNumber
0 голосов
/ 19 октября 2019

Вы можете написать запрос как:

select sum (IA.Amount) as Amount, J.JobNumber,A.Name
from @Invoice_Accounts IA --as it holds the base data
join @Job_Invoices JI on IA.InvoiceId = JI.ID
join @Jobs J on J.id = JI.JobID
join @Accounts A on A.ID = IA.AccountID
group by J.JobNumber,A.Name

Включена таблица Jobs, так как она имеет столбец JobNumber. Пример кода здесь ..

...