Разделите результаты двух запросов и получите результат в третьем запросе. - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть два SQL-запроса, которые я хочу разделить. Каждый запрос работает самостоятельно, и я хочу разделить его результаты и получить в третью переменную, но я не уверен, как.

Этот запрос не вычисляет ни одного из отмененных членов

(select count(*) as No_of_Member_Cancelled, M.HomeBranch,M.LocationName from 
 AX.Memberships  M
 where M.ActiveEnd between DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 
 0) and DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) ,-1)
 group by M.HomeBranch,M.LocationName) as g1

Этот запросвычислить количество активных членов

(select count(*)as No_of_Live_Member , M.HomeBranch,M.LocationName
from AX.Memberships M 
where M.ActiveStart between DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 
1, 0) and DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) ,-1)
group by M.HomeBranch,M.LocationName) as g2

Мы получаем результаты, подобные этому

, если x = g1 / g2

x, LocationName, HomeBranch в одной таблице

Ответы [ 3 ]

1 голос
/ 11 ноября 2019

Лучше всего изменить их на временные таблицы, тогда вы можете сделать это так:

select No_of_Member_Cancelled / No_of_Live_Member as x, HomeBranch, LocationName
    from G1
    join G2 on g1.HomeBranch = g2.HomeBranch and g1.LocationName = g2.LocationName
    group by HomeBranch, LocationName
0 голосов
/ 14 ноября 2019
    SELECT distinct CAST (g1.no_of_member_cancelled AS DECIMAL(10, 2)) / 
       CAST (g2.no_of_live_member AS DECIMAL(10, 2)) AS x, 
       g1.homebranch, 
       g1.locationname,
       g1.month,
       g1.year 

FROM  (SELECT Count(*) AS No_of_Member_Cancelled, 
               M.homebranch, 
               M.locationname,
               month(M.ActiveStart) month,
               YEAR(M.ActiveStart) year

        FROM   ax.memberships M 
        WHERE  M.activeend BETWEEN Dateadd(year, Datediff(year, 0, Getdate()) - 2, 0)  
                                   AND 
                                   Dateadd(year, Datediff(year, 0, Getdate()), -1)
        GROUP  BY M.homebranch, 
                  M.locationname,month(M.ActiveStart),
                  year(M.ActiveStart)) AS g1 
       INNER JOIN (SELECT Count(*)AS No_of_Live_Member, 
                          M.homebranch, 
                          M.locationname,
                          month(M.ActiveStart) month,
                          YEAR(M.ActiveStart) year

                   FROM   ax.memberships M 
                   WHERE  M.activestart BETWEEN Dateadd(year, Datediff(year, 0, Getdate()) - 2, 0) 
                                        AND 
                                        Dateadd(year, Datediff(year, 0, Getdate()), -1)
                   GROUP  BY M.homebranch, 
                             M.locationname,
                             month(M.ActiveStart),
                             year(M.ActiveStart)
                             ) AS g2 
               ON g1.homebranch = g2.homebranch 
                  AND g1.locationname = g2.locationname
                  AND g1.month = g2.month
                  AND g1.year = g2.year
                  Order by g1.year,g1.month

Можете ли вы проверить, правильный ли мой запрос или нет. Потому что я хотел получить с последних 2 лет.

0 голосов
/ 11 ноября 2019

Попробуйте это ...

SELECT CAST (g1.no_of_member_cancelled AS DECIMAL(10, 2)) / 
       CAST (g2.no_of_live_member AS DECIMAL(10, 2)) AS x, 
       g1.homebranch, 
       g1.locationname 
FROM   (SELECT Count(*) AS No_of_Member_Cancelled, 
               M.homebranch, 
               M.locationname 
        FROM   ax.memberships M 
        WHERE  M.activeend BETWEEN Dateadd(month, Datediff(month, 0, Getdate()) 
                                                  - 1, 0) 
                                   AND 
                                           Dateadd(month, Datediff(month, 0, 
                                                          Getdate()) 
                                           , -1) 
        GROUP  BY M.homebranch, 
                  M.locationname) AS g1 
       INNER JOIN (SELECT Count(*)AS No_of_Live_Member, 
                          M.homebranch, 
                          M.locationname 
                   FROM   ax.memberships M 
                   WHERE  M.activestart BETWEEN Dateadd(month, Datediff(month, 0 
                                                               , 
                                                               Getdate()) - 1, 
                                                0) AND 
                          Dateadd(month, Datediff(month, 
                                         0, Getdate( 
                                         )), -1) 
                   GROUP  BY M.homebranch, 
                             M.locationname) AS g2 
               ON g1.homebranch = g2.homebranch 
                  AND g1.locationname = g2.locationname 

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

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