Возможность воссоздания сложного SQL-запроса в Crystal Reports XI - PullRequest
0 голосов
/ 20 октября 2011

У меня есть около 10 довольно сложных запросов SQL на SQL Server 2008 - но клиент хочет иметь возможность запускать их из своей внутренней сети (в отличие от нелокального веб-приложения) через Crystal Reports XI.

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

SQL содержит несколько экземпляров row_number () over (разбиение по col1, col2) , , группирование по col1, col2 с кубом | rollup и / или (несколько) сводок .

Может ли это быть даже сделано? Все, что я прочитал, указывает на то, что это возможно только с помощью хранимой процедуры, и мне все равно нужно сначала извлечь данные из проприетарной базы данных.

Ниже приведена сокращенная версия одного из запросов (например, JOIN, не связанные непосредственно с функциональностью, предложения WHERE и полдюжины столбцов были удалены) ...


select sum(programID)
    , sum([a.Asian]) as [Episodes - Asian], sum([b.Asian]) as [Eps w/ Next Svc - Asian], sum([c.Asian])/sum([b.Asian]) as [Avg Days to Next Svc - Asian]
    , <i>etc... (repeats for each ethnicity)</i>
from (
    select programID, 'a.' + ethnicity as ethnicityA, 'b.' + ethnicity as ethnicityB, 'c.' + ethnicity as ethnicityC
        , count(*) as episodes, count(daysToNextService) as episodesWithNextService, sum(daysToNextService) as daysToNextService
    from (
        select programID, ethnicity, datediff(dateOfDischarge, nextDateOfService) as daysToNextService from (
            select t1.userID, t1.programID, t1.ethnicity, t1.dateOfDischarge, t1.dateOfService, min(t2.dateOfService) as nextDateOfService
            from TABLE1 as t1 left join TABLE1 as t2
                on datediff(d, t1.dateOfService, t2.dateOfService) between 1 and 31 and t1.userID = t2.userID
            group by t1.userID, t1.programID, t1.ethnicity, t1.dateOfDischarge, t1.dateOfService
        ) as a
    ) as a
    group by programID
) as a
pivot (
    max(episodes) for ethnicityA in ([A.Asian],[A.Black],[A.Hispanic],[A.Native American],[A.Native Hawaiian/ Pacific Isl.],[A.White],[A.Unknown])
) as pA
pivot (
    max(episodesWithNextService) for ethnicityB in ([B.Asian],[B.Black],[B.Hispanic],[B.Native American],[B.Native Hawaiian/ Pacific Isl.],[B.White],[B.Unknown])
) as pB
pivot (
    max(daysToNextService) for ethnicityC in ([C.Asian],[C.Black],[C.Hispanic],[C.Native American],[C.Native Hawaiian/ Pacific Isl.],[C.White],[C.Unknown])
) as pC
group by programID with rollup

Оооооооо .... может ли что-то подобное даже быть переведено в Crystal Reports XI?

Спасибо!

1 Ответ

0 голосов
/ 20 октября 2011

Когда вы создаете свой отчет вместо выбора таблицы или хранимой процедуры, выберите add command

Это позволит вам добавить туда любой действительный оператор TSQL, какой вы захотите.Используя общие табличные выражения (CTE) и встроенные представления, мне удалось создать довольно большие сложные операторы (более 400 строк) для Oracle и SQL Server, поэтому это действительно выполнимо, однако, если вы используете параметры , вам следует рассмотреть возможность использованияsp_executesql вам придется выяснить, как избежать SQL-инъекций.

...