Hemil Gandhi Ответов: 1

Избегайте объединения всех (кратных между)


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

Есть ли другой способ написать этот запрос?

Заранее спасибо

Что я уже пробовал:

SELECT 'UPTO 1 LAKH' AS 'Cretiria',COUNT(*) as Account ,SUM(LimitAmt) as Limit FROM LON20190629 where [LimitAmt] between 0 and 100000 and AcOpDt>=20190401
UNION ALL
SELECT 'ABOVE 1 AND UPTO 5' AS 'Cretiria', COUNT(*),SUM(LimitAmt)  FROM LON20190629 where [LimitAmt] between 100001  and 500000 and AcOpDt>=20190401
UNION ALL
SELECT 'ABOVE 5 AND UPTO 10' AS 'Cretiria', COUNT(*),SUM(LimitAmt)  FROM LON20190629 where [LimitAmt] between 500001 AND 1000000 and AcOpDt>=20190401
UNION ALL
SELECT 'ABOVE 10 AND UPTO 25' AS 'Cretiria', COUNT(*),SUM(LimitAmt)  FROM LON20190629 where [LimitAmt] between 1000001 AND 2500000 and AcOpDt>=20190401
UNION ALL
SELECT 'ABOVE 25 AND UPTO 1CR' AS 'Cretiria', COUNT(*),SUM(LimitAmt)  FROM LON20190629 where [LimitAmt] between 2500000 AND 10000000 and AcOpDt>=20190401
UNION ALL
SELECT 'ABOVE 1CR' AS 'Cretiria', COUNT(*),SUM(LimitAmt)  FROM LON20190629 where [LimitAmt]>10000000 and AcOpDt>=20190401

1 Ответов

Рейтинг:
10

Wendelius

Прежде всего, почему вы хотите переписать это? Если запрос возвращает правильные результаты и выполняется достаточно быстро, то в чем же выгода?

Если вы беспокоитесь о плане выполнения, то выбор оптимального плана-это работа оптимизатора, и он довольно часто делает хорошую работу, пока доступны правильные пути доступа.

Сказав это, Это можно переписать несколькими способами. Например, одним из вариантов может быть что-то вроде

with innerquery (Criteria, LimitAmt) AS (
   SELECT CASE
          WHEN [LimitAmt] between 0       and 100000 THEN 'UPTO 1 LAKH' 
          WHEN [LimitAmt] between 100001  and 500000 THEN 'ABOVE 1 AND UPTO 5'
          WHEN [LimitAmt] between 500001 AND 1000000 THEN 'ABOVE 5 AND UPTO 10'
		  ...
		  WHEN [LimitAmt] > 10000000 THEN 'ABOVE 1CR'
	   END AS Criteria,
       LimitAmt
   FROM LON20190629 
   WHERE AcOpDt>=20190401
)
SELECT iq.Criteria,
       COUNT(*) as Account,
	   SUM(iq.LimitAmt) as Limit
FROM innerquery iq
GROUP BY iq.Criteria;


Maciej Los

5ed!

Wendelius

Спасибо!

Espen Harlinn

Привет, Мика, приятно видеть, что ты все еще здесь, кстати. хороший ответ :-)

Wendelius

Привет, Эспен, и рад тебя слышать! Давно не виделись :)

Espen Harlinn

Ну вот, я вернулся ... Я написал пару статей об ESE, ядре базы данных no sql, входящем в состав Windows.

Wendelius

Вот это здорово! В какой-то момент мне придется прочитать эти статьи, всегда приятно узнавать что-то новое.

Espen Harlinn

Спасибо, желаю вам блестящих выходных :-)

Maciej Los

О, да!
Я тоже рад тебя видеть, Эспен. ;)

Espen Harlinn

Спасибо, надеюсь, у вас тоже все хорошо :-)

Maciej Los

:большой палец вверх:

Hemil Gandhi

Большое вам спасибо за такое замечательное решение

Wendelius

Всегда пожалуйста :)

Hemil Gandhi

Не могли бы вы помочь мне с моей проблемой, описанной в приведенной ниже ссылке, пожалуйста, помогите.

https://www.codeproject.com/Questions/5274724/Get-lower-value-through-mupltiple-joins

Я очень долго ищу решение этой проблемы.