Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Исключение строк  [new]
kuzinnv
Member

Откуда:
Сообщений: 2
Здравствуйте. Имеется запрос:
SELECT TENANTS_GARAGES_OWNERS.TenantName, TENANTS_GARAGES_OWNERS.TenantAddress, CONTRACTS.ContractNumber, ISNULL(CONTRACTS.ContractDate, '') AS ContractDate,
ISNULL(CONTRACTS.ContractDateCancel, '') AS ContractDateCancel, (SELECT Purpose FROM Dir_PurposeOfUse WHERE (ID = SITES.IDPurposeOfUse)) AS Purpose,
(SELECT GroundAreaRight FROM Dir_GroundAreaRights WHERE (ID = SITES.IDGroundAreaRight)) AS GroudAreaRight,
(SELECT AreaAddress FROM Dir_SiteArea WHERE (ID = SITES.IDSiteArea)) AS AreaAddress, SITES.SomeNumber, SITES.BoxNumber,
(SELECT SUM(ISNULL(CHARGES.ChargeSum, 0)) FROM CHARGES WHERE (IDSite = SITES.ID)) - (SELECT SUM(ISNULL(PAYMENTS.PaymentSum, 0)) FROM PAYMENTS WHERE (IDSite = SITES.ID) AND (IDPaymentPurpose IN(1, 3))) AS Debt
FROM TENANTS_GARAGES_OWNERS, CONTRACTS, SITES
WHERE (SITES.IDContract IS NOT NULL) AND (SITES.IDContract = CONTRACTS.ID) AND ((CONTRACTS.ContractDateClosed >= GETDATE()) OR (CONTRACTS.ContractDateClosed IS NULL)) AND (CONTRACTS.IDTenant = TENANTS_GARAGES_OWNERS.ID) AND (CONTRACTS.TenantKind = 'TENANTS_GARAGES_OWNERS') ORDER BY TenantName'

Данные собираю из разных таблиц. Поясню: 1 таблица - арендаторы, 2 - их договоры, 3 - участки договоров, 4 и 5 - начисления и платежи по участку.
Вопрос #1: как исключить строки в которых результат колонки Debt <= 0?? Т.е. оставить только цифры больше нуля?
Вопрос #2: почему SQL возвращает пустую дату в виде 01.01.1900, если я использую функцию ISNULL?
Заранее большое спасибо))

P.S. Запрос выложил как есть. Если возникнут вопросы, буду отвечать в комментариях.
27 янв 12, 17:48    [11985547]     Ответить | Цитировать Сообщить модератору
 Re: Исключение строк  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
kuzinnv
Вопрос #2: почему SQL возвращает пустую дату в виде 01.01.1900, если я использую функцию ISNULL?
Пустая дата - это null. Вы же сами ее меняете функцией isnull и еще удивляетесь чему-то.
27 янв 12, 17:50    [11985559]     Ответить | Цитировать Сообщить модератору
 Re: Исключение строк  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
kuzinnv
Вопрос #1: как исключить строки в которых результат колонки Debt <= 0?? Т.е. оставить только цифры больше нуля?

select
  a.*
from (
SELECT TENANTS_GARAGES_OWNERS.TenantName, TENANTS_GARAGES_OWNERS.TenantAddress, CONTRACTS.ContractNumber, ISNULL(CONTRACTS.ContractDate, '') AS ContractDate,
ISNULL(CONTRACTS.ContractDateCancel, '') AS ContractDateCancel, (SELECT Purpose FROM Dir_PurposeOfUse WHERE (ID = SITES.IDPurposeOfUse)) AS Purpose,
(SELECT GroundAreaRight FROM Dir_GroundAreaRights WHERE (ID = SITES.IDGroundAreaRight)) AS GroudAreaRight,
(SELECT AreaAddress FROM Dir_SiteArea WHERE (ID = SITES.IDSiteArea)) AS AreaAddress, SITES.SomeNumber, SITES.BoxNumber,
(SELECT SUM(ISNULL(CHARGES.ChargeSum, 0)) FROM CHARGES WHERE (IDSite = SITES.ID)) - (SELECT SUM(ISNULL(PAYMENTS.PaymentSum, 0)) FROM PAYMENTS WHERE (IDSite = SITES.ID) AND (IDPaymentPurpose IN(1, 3))) AS Debt
FROM TENANTS_GARAGES_OWNERS, CONTRACTS, SITES
WHERE (SITES.IDContract IS NOT NULL) AND (SITES.IDContract = CONTRACTS.ID) AND ((CONTRACTS.ContractDateClosed >= GETDATE()) OR (CONTRACTS.ContractDateClosed IS NULL)) AND (CONTRACTS.IDTenant = TENANTS_GARAGES_OWNERS.ID) AND (CONTRACTS.TenantKind = 'TENANTS_GARAGES_OWNERS') 
) a
where Debt > 0
ORDER BY TenantName
27 янв 12, 17:51    [11985580]     Ответить | Цитировать Сообщить модератору
 Re: Исключение строк  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
kuzinnv,
1. Избавтесь от коррелированных подзапросов переписав их через обычное объединение
2. Не используйте старый синтаксис TENANTS_GARAGES_OWNERS, CONTRACTS, SITES т.к. он не очевиден
3. Запрос выложите не как есть, а в нормальном, форматированном виде (ессно после того как перепишите).
4.
kuzinnv
почему SQL возвращает пустую дату в виде 01.01.1900, если я использую функцию ISNULL

Потому что гладиолус.
SELECT CAST(NULL AS DATETIME), CAST(0 AS DATETIME)

Разберитесь с вашими преобразованиями и пониманием того, что есть пустая дата. Заодно почитайте про DATETIME2, DATE эти типы не всякие вольности допускает.

Большое пожалуйста.
27 янв 12, 17:58    [11985646]     Ответить | Цитировать Сообщить модератору
 Re: Исключение строк  [new]
kuzinnv
Member

Откуда:
Сообщений: 2
Гавриленко Сергей Алексеевич,
спасибо за помощь, на работе попробую.
kDnZP
Я SQL только изучаю. Подскажите как правильно переписать запрос? Проблема в том, что у одного арендатора может быть несколько договоров, а у каждого договора может быть несколько участков. Я увидел только такой вариант. Кстати, он отрабатывает у меня мгновенно.
27 янв 12, 22:42    [11987129]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить