Поиск коэффициента высадки из таблицы членства в SQL Server 2005 - PullRequest
1 голос
/ 27 июля 2010

По нашему мнению, хранится история планов членства наших участников, и в течение некоторого времени мы работали с предложением прямого дебета за полцены. Нас попросили сообщить, разрешают ли люди возобновить прямой дебет (по полной цене), но я не эксперт по SQL!

Действующее представление

memberRef, historyRef, validFrom, validTo,MembershipType,PaymentType,totalAmount

Здесь

  • memberRef идентифицирует человека (int)
  • historyRef определяет эту строку (int)
  • validFrom и validTo - начало и конец плана (дата / время)
  • MembershipType - это тип плана (int)
  • PaymentType - это прямая дебетовая или кредитная карта (строка - DD или EFT)
  • totalAmount - цена плана (десятичная)

Мне интересно, есть ли запрос в отличие от курсора, который я могу использовать для подсчета количества политик, которые имеют половину цены и имеют другую политику прямого дебетования, которая вытекает из нее.

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

Заранее спасибо за любую помощь!

Например

select count(MemberRef), max(vhOuter.validFrom) "most recent plan start",
(select top(1) vh2.validFrom 
from v_Membershiphistory vh2 
where (vh2.totalamount = 14.97 or vh2.totalamount = 25.50)  
and vh2.memberref = vhOuter.memberref
order by createdat desc
) "half price plan start"
from v_membershiphistory vhOuter
where vhOuter.memberref in (select vh1.memberref from v_membershiphistory vh1 where     vh1.totalamount = 14.97 or vh1.totalamount = 25.50)--have taken up offer
group by memberref
having max(vhOuter.validFrom) > (select top(1) vh2.validFrom 
                                from v_Membershiphistory vh2 
                                where (vh2.totalamount = 14.97 or vh2.totalamount = 25.50)  
                                and vh2.memberref = vhOuter.memberref
                                order by createdat desc
                            )

Здесь будут отображаться участники, у которых есть план с половинной ценой и действительная дата с даты, которая больше действительной с даты этого плана.

Не совсем верно, поскольку мы должны проверять, что это тот же план, но ...

если я изменю выбор здесь, чтобы просто считать (memberRef), я получаю счет memberRef для члена, которого я группирую для каждого члена, которого я группирую, то есть для 5220 результатов я получу 5220 строк, возвращенных каждая с действующим количество планов, которые я выбрал

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

Полагаю, я смотрю, как человек работает на съемочной площадке, но сравнивает несколько строк для каждого отдельного человека без использования курсора. Но я могу ошибаться:)

1 Ответ

1 голос
/ 27 июля 2010

попробуйте что-то вроде:

SELECT
    a.*, b.*
    FROM YourTable           a
        INNER JOIN YourTable b On a.memberRef=b.memberRef and a.validToDate<b.validFromDate
    WHERE b.PaymentType='?direct debit?' and a.Cost='?half price?'

, чтобы получить только счет, используйте что-то вроде:

SELECT
    COUNT(a.memberRef) AS TotalCount
    FROM YourTable           a
        INNER JOIN YourTable b On a.memberRef=b.memberRef and a.validToDate<b.validFromDate
    WHERE b.PaymentType='?direct debit?' and a.Cost='?half price?'
...