как упростить запрос выбора

0

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

SELECT @licenseCount = COUNT(*)  FROM ServicePool SP
INNER JOIN UserPackages UP ON UP.ServicePoolId = SP.Id 
    AND SP.UserId = UP.UserId
INNER JOIN Package P ON P.Id = UP.PackageId
LEFT OUTER JOIN CompanyProfile C ON C.LicenseId = SP.Id         
INNER JOIN CompanyProfile CP ON CP.CurrencyId = P.CurrencyId    
INNER JOIN PackageCategory PC ON PC.OrganizationTypeId = CP.OrganisationType 
    AND PC.PackageId = P.Id     
WHERE SP.Active = 1  
    AND SP.UserId = @uId 
    AND P.Active = 1  
    and CP.CompanyID = @cId
    and ISNULL(C.CompanyID,0) = 0 
    AND DATEDIFF(DAY,GETDATE(),DATEADD(DAY,P.ValidityPeriod,UP.PurchaseDate)) > 0 



SELECT @paymentCount = COUNT(*)  FROM ServicePool SP
INNER JOIN UserPackages UP ON UP.ServicePoolId=SP.Id 
    AND SP.UserId = UP.UserId
INNER JOIN Package P ON P.Id = UP.PackageId
LEFT OUTER JOIN CompanyProfile C ON C.LicenseId = SP.Id         
INNER JOIN CompanyProfile CP ON CP.CurrencyId = P.CurrencyId    
INNER JOIN PackageCategory PC ON PC.OrganizationTypeId = CP.OrganisationType 
    AND PC.PackageId = P.Id         
WHERE SP.Active = 1 
    AND SP.UserId = @uId 
    AND P.Active = 1  
    and CP.CompanyID = @cId
    and ISNULL(C.CompanyID,0) = 0 
    AND DATEDIFF(DAY,GETDATE(),DATEADD(DAY,P.ValidityPeriod,UP.PurchaseDate)) > 0 
    AND UP.PaymentStatus = 'P'

Как видите, единственное различие между двумя вышеупомянутыми запросами выбора состоит в том, что в конце второго есть дополнительное условие where, AND UP.PaymentStatus = 'P'.

Мне было интересно, есть ли способ упростить эти запросы?

  • 0
    что вы подразумеваете под "упрощением"? также у вас будут повторяющиеся данные ... почему у первого нет: AND UP.PaymentStatus <> 'P'
  • 0
    UP.PaymentStatus может быть W or P , в любом случае необходимо принять первое условие, а во втором - только если UP.PaymentStatus = P
Теги:
stored-procedures

1 ответ

1

Ниже будет запрос

SELECT @licenseCount = COUNT(*), @paymentCount = COUNT(case when UP.PaymentStatus = 'P' then 1 else 0 end)   FROM ServicePool SP
    INNER JOIN UserPackages UP ON UP.ServicePoolId = SP.Id 
        AND SP.UserId = UP.UserId
    INNER JOIN Package P ON P.Id = UP.PackageId
    LEFT OUTER JOIN CompanyProfile C ON C.LicenseId = SP.Id         
    INNER JOIN CompanyProfile CP ON CP.CurrencyId = P.CurrencyId    
    INNER JOIN PackageCategory PC ON PC.OrganizationTypeId = CP.OrganisationType 
        AND PC.PackageId = P.Id     
    WHERE SP.Active = 1  
        AND SP.UserId = @uId 
        AND P.Active = 1  
        and CP.CompanyID = @cId
        and ISNULL(C.CompanyID,0) = 0 
        AND 
DATEDIFF(DAY,GETDATE(),DATEADD(DAY,P.ValidityPeriod,UP.PurchaseDate))

Вы можете определить переменную @paymentCount в самом первом запросе

Результаты теста -

hive> select * from test_so_t1;
OK
123     90001   90001
123     90001   90002
123     90001   90003
123     90002   90001
123     90002   90002
123     90003   90002
123     90003   90003
Time taken: 0.118 seconds, Fetched: 7 row(s)
hive> select count(case when mem_id=90001 then 1 else 0 end) as groupBy, group_id from test_so_t1 group by group_id;
Total MapReduce CPU Time Spent: 3 seconds 900 msec
OK
7       123
Time taken: 17.271 seconds, Fetched: 1 row(s)
  • 0
    в вашем ответе @paymentCount только 1 или 0, но мне нужно count(*)
  • 0
    это не должно иметь место, вы получите 1, только если число записей с Payment_status = 'P' равно 1 или 0 ... или проблема может быть связана с тем, что ваш запрос также обновил мой ответ с результатами теста,

Ещё вопросы

Сообщество Overcoder
Наверх
Меню