Получить все данные из первой таблицы, даже если в объединенной таблице нет объединенных записей - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть четыре таблицы: Ledger, AccMaster, AccDetail, AccGroup.

CREATE TABLE AccDetail (DetailID int,
                        MasterID int,
                        LedgerID int,
                        Credit decimal(18, 2));
INSERT INTO AccDetail
VALUES (1, 1, 1, 500), (2,2,2,1000);

CREATE TABLE Ledgers (ID int,
                      Name varchar(10),
                      AccGroupID int);
INSERT INTO Ledgers
VALUES (1, 'A', 1),
       (2, 'B', 1);

CREATE TABLE AccMaster (MasterID int,
                        Date date);
INSERT INTO AccMaster
VALUES (1, '2019-11-04'),
       (2, '2019-11-03');

CREATE TABLE AccGroup (ID int,
                       Name varchar(10));
INSERT INTO AccGroup
VALUES (1, 'Accounts'),
       (2, 'Others');

SELECT AL.Name,
       SUM(AD.Credit)
FROM AccDetail AD
     LEFT OUTER JOIN Ledgers AL ON AL.ID = AD.LedgerID
     LEFT OUTER JOIN AccMaster AM ON AM.MasterID = AD.MasterID
     LEFT OUTER JOIN AccGroup AG ON AG.ID = AL.AccGroupID
WHERE AM.Date = '2019-11-04'
GROUP BY AL.Name;

Я получаю результат только для одной записи таблицы Ledger, даже если в таблице Ledger есть две записи. Это потому, что в других таблицах нет соответствующей записи для этой книги. Я нашел много ответов с левым и правым соединением, но по моему желанию ничего не работает.

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

РЕЗУЛЬТАТ, КОТОРЫЙ Я ХОЧУ ПОЛУЧИТЬ


| Name  | Credit| 
-----------------
| A     | 500   |
-----------------
| B     |  0    |
-----------------

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019
SELECT Al.Name,
       SUM(ISNULL(AD.Credit,0))
FROM Ledgers AL
    LEFT OUTER JOIN AccDetail AD ON AL.Id = AD.LedgerID
    LEFT OUTER JOIN AccMaster AM ON AM.MasterID = AD.MasterID
    LEFT OUTER JOIN AccGroup AG ON AG.ID = AL.AccGroupID
WHERE AM.Date = '2019-11-04' OR AM.Date IS NULL 
GROUP BY Al.Name
0 голосов
/ 04 ноября 2019

SQL Fiddle

Настройка схемы MS SQL Server 2017 :

CREATE TABLE AccDetail (DetailID int,
                        MasterID int,
                        LedgerID int,
                        Credit decimal(18, 2));
INSERT INTO AccDetail
VALUES (1, 1, 1, 500);

CREATE TABLE Ledgers (ID int,
                      Name varchar(10),
                      AccGroupID int);
INSERT INTO Ledgers
VALUES (1, 'A', 1),
       (2, 'B', 1);

CREATE TABLE AccMaster (MasterID int,
                        Date date);
INSERT INTO AccMaster
VALUES (1, '2019-11-04'),
       (2, '2019-11-03');

CREATE TABLE AccGroup (ID int,
                       Name varchar(10));
INSERT INTO AccGroup
VALUES (1, 'Accounts'),
       (2, 'Others');

Запрос 1 :

SELECT AL.Name,
       ISNULL(SUM(AD.Credit),0) AS SumOfCredits
FROM  Ledgers AL 
     LEFT OUTER JOIN AccDetail AD ON AL.ID = AD.LedgerID
     LEFT OUTER JOIN AccMaster AM ON AM.MasterID = AD.MasterID
     LEFT OUTER JOIN AccGroup AG ON AG.ID = AL.AccGroupID
     WHERE AM.Date = '2019-11-04' OR AM.Date IS NULL
GROUP BY AL.Name

Результаты :

| Name | SumOfCredits |
|------|--------------|
|    A |          500 |
|    B |            0 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...