Как я могу получить этот запрос, чтобы вернуть 0 вместо нуля? - PullRequest
5 голосов
/ 19 мая 2009

У меня есть этот запрос:

SELECT (SUM(tblTransaction.AmountPaid) - SUM(tblTransaction.AmountCharged)) AS TenantBalance, tblTransaction.TenantID
    FROM tblTransaction
    GROUP BY tblTransaction.TenantID

Но есть проблема с этим; есть другие TenantID, которые не имеют транзакций, и я тоже хочу их получить.

Например, таблица транзакций имеет 3 строки для Боба, 2 строки для Джона и ни одной для Джейн. Я хочу вернуть сумму для Боба и Джона И вернуть 0 для Джейн. (или, возможно, ноль, если нет другого пути)

Как я могу это сделать?

Таблицы такие:

Tenants  
  ID  
  Other Data  
Transactions  
  ID  
  TenantID (fk to Tenants)
  Other Data  

Ответы [ 5 ]

15 голосов
/ 19 мая 2009

(Вы не указали свой движок sql, поэтому я собираюсь сослаться на документацию по MySQL).

Это почти то же самое, для чего предназначена функция COALESCE(). Вы можете передать ему список, и он вернет первое ненулевое значение в списке. Вы бы использовали это в своем запросе следующим образом:

SELECT COALESCE((SUM(tr.AmountPaid) - SUM(tr.AmountCharged)), 0) AS TenantBalance, te.ID
FROM tblTenant AS te
    LEFT JOIN tblTransaction AS tr ON (tr.TenantID = te.ID)
GROUP BY te.ID;

Таким образом, если результат SUM() будет НЕДЕЙСТВИТЕЛЕН, он заменяется на ноль.

Отредактировано : я переписал запрос, используя левое соединение, а также COALESCE(), я думаю, что это ключ к тому, чего вам не хватало изначально. Если вы выбираете только из таблицы «Операции», то нет способа получить информацию о вещах , а не в таблице. Однако, используя левое соединение из таблицы Tenants, вы должны получить строку для каждого существующего арендатора.

1 голос
/ 19 мая 2009

Ниже приводится полное описание проблемы. Функция isnull также была включена, чтобы гарантировать, что нулевой баланс (а не ноль) возвращается для Арендаторов без транзакций.

create table tblTenant
(
    ID int identity(1,1) primary key not null,
    Name varchar(100)
);

create table tblTransaction
(
    ID  int identity(1,1) primary key not null,
    tblTenantID int,
    AmountPaid  money,
    AmountCharged money
);

insert into tblTenant(Name)
select 'bob' union all select 'Jane' union all select 'john';

insert into tblTransaction(tblTenantID,AmountPaid, AmountCharged)
select 1,5.00,10.00
union all
select 1,10.00,10.00
union all
select 1,10.00,10.00
union all
select 2,10.00,15.00
union all 
select 2,15.00,15.00


select * from tblTenant
select * from tblTransaction

SELECT 
    tenant.ID, 
    tenant.Name,
    isnull(SUM(Trans.AmountPaid) - SUM(Trans.AmountCharged),0) AS Balance 
FROM tblTenant tenant
    LEFT JOIN tblTransaction Trans ON 
        tenant.ID = Trans.tblTenantID
GROUP BY tenant.ID, tenant.Name;

drop table tblTenant;
drop table tblTransaction;
0 голосов
/ 19 мая 2009
SELECT (SUM(ISNULL(tblTransaction.AmountPaid, 0)) 
        - SUM(ISNULL(tblTransaction.AmountCharged, 0))) AS TenantBalance
       , tblTransaction.TenantID
        FROM tblTransaction
        GROUP BY tblTransaction.TenantID

Я добавил это только потому, что если вы намерены принять во внимание, что одна из частей имеет значение null, вам нужно выполнить ISNULL отдельно

0 голосов
/ 19 мая 2009

На самом деле я нашел ответ:

SELECT tenant.ID, ISNULL(SUM(trans.AmountPaid) - SUM(trans.AmountCharged),0) AS Balance FROM tblTenant tenant
LEFT JOIN tblTransaction trans
ON tenant.ID = trans.TenantID
GROUP BY tenant.ID
0 голосов
/ 19 мая 2009
Select Tenants.ID, ISNULL((SUM(tblTransaction.AmountPaid) - SUM(tblTransaction.AmountCharged)), 0) AS TenantBalance
From Tenants 
Left Outer Join Transactions Tenants.ID = Transactions.TenantID
Group By Tenents.ID

Я не проверял синтаксис, но он достаточно близко.

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