Возможность воссоздания сложного SQL-запроса в Crystal Reports XI

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

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

SQL содержит несколько экземпляров row_number() over (partition by col1, col2), group by col1, col2 with cube|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]
    , etc... (repeats for each ethnicity)
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?

Спасибо!


person will_    schedule 19.10.2011    source источник
comment
Если у них нет доступа к данным из их внутренней сети, как они будут запускать отчет?   -  person JNK    schedule 20.10.2011
comment
Они делают; до сих пор они еженедельно экспортировали свою проприетарную базу данных в наше веб-приложение.   -  person will_    schedule 20.10.2011
comment
откуда вы знаете, что передовые методы SQL будут работать даже против их проприетарной базы данных? Передовые методы, как правило, специфичны для баз данных.   -  person HLGEM    schedule 20.10.2011
comment
Это именно причина, по которой я пытаюсь выяснить, можно ли это вообще перевести в Crystal Reports. :)   -  person will_    schedule 20.10.2011


Ответы (1)


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

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

person Conrad Frix    schedule 19.10.2011
comment
Знаете ли вы, просто ли это передача команды на сервер базы данных? Серверная часть доступна только через ODBC и не является сервером MSSQL или Oracle, поэтому не сможет самостоятельно обрабатывать T-SQL. Это должно произойти на сервере Crystal Reports. - person will_; 20.10.2011
comment
Да, команда будет отправлена ​​на сервер БД, выполнена там и возвращена в отчет. Кстати, так как вы пометили его как TSQL, это Sybase? - person Conrad Frix; 20.10.2011
comment
У меня нет никакой информации об их бэкэнде, кроме того, что это какая-то проприетарная система. Я пометил его как TSQL, потому что именно в нем я написал исходные запросы (которые работают с нашей экспортированной версией базы данных). - person will_; 20.10.2011
comment
ну, это все еще возможно, пока БД допускает встроенные представления (я не знаю ни одного, которые этого не делают), но избегание SQL-инъекций может быть причиной для беспокойства. - person Conrad Frix; 20.10.2011
comment
Я получил больше информации о бэкэнде; похоже, что он не поддерживает ROLLUP, CUBE или row_number(), поэтому без этой функциональности в Crystal Reports этот проект выглядит мертвым. Я отмечаю ваш ответ как правильный - я ценю вашу помощь! - person will_; 21.10.2011