【问题标题】:Convert IBM Cognos SQL which contains a filter to Microsoft SQL Server Query将包含过滤器的 IBM Cognos SQL 转换为 Microsoft SQL Server Query
【发布时间】:2020-11-10 03:05:00
【问题描述】:

我正在尝试将包含过滤器的 IBM Cognos SQL 转换为 Microsoft SQL Server Query。

我尝试在 Microsoft SQL Server 查询中应用过滤器,但没有成功。

这里是 IBM Cognos 查询:

IBM Cognos SQL

select
       rank() over ( at client__iacode.ia_code order by XCOUNT(client_document.client_document_id  for client__iacode.ia_code ) desc nulls last)  as  Rank_IA,
       client__iacode.ia_code  as  IA_Code,
       client__iacode.ia_short_descr  as  IA_Short_Descr,
       XCOUNT(client_document.client_document_id  for client__iacode.ia_code,client__iacode.ia_short_descr )  as  Doc_Count,
       XCOUNT(client.client_code  at client__iacode.ia_code,client__iacode.ia_short_descr,client.client_id  for client__iacode.ia_code,client__iacode.ia_short_descr )  as  Client_Count,
       XSUM(XCOUNT(client_document.client_document_id  for client__iacode.ia_code,client__iacode.ia_short_descr )  at client__iacode.ia_code,client__iacode.ia_short_descr )  as  Total_Doc_Count_,
       XSUM(XCOUNT(client.client_code  at client__iacode.ia_code,client__iacode.ia_short_descr,client.client_id  for client__iacode.ia_code,client__iacode.ia_short_descr )  at client__iacode.ia_code,client__iacode.ia_short_descr )  as  Total_Client_Count_
from
       (
           dbo.client client
           join
           dbo.broker client__broker
           on (client.broker_id = client__broker.broker_id)
           join
           dbo.ia_code client__iacode
           on (client.ia_code_id = client__iacode.ia_code_id)
           join
           dbo.client_document client_document
           on (client.client_id = client_document.client_id)
           join
           dbo.client_status client_status
           on (client.client_status_id = client_status.client_status_id)
           join
           dbo.provider client__provider
           on (client__provider.provider_id = client.provider_id)
       )
       left outer join
       dbo.branch client__iacode__branch
       on (client__iacode.branch_id = client__iacode__branch.branch_id)
where
       (client_document.requested_date is not NULL) and
       (client_document.received_date is NULL) and
       (client__iacode__branch.branch_descr = CAST(:PQ1 AS varchar(255))) and
       (client__broker.broker_code = 'CCC') and
       (client_status.client_status_code = 'A') and
       ((client__provider.provider_code <> 'PRS-R') or (client__provider.provider_code is NULL))
group by
       client__iacode.ia_code,
       client__iacode.ia_short_descr
filter
       (rank() over ( at client__iacode.ia_code order by XCOUNT(client.client_code  at client__iacode.ia_code,client.client_id  for client__iacode.ia_code ) desc nulls last) <= 25) and
       (RCOUNT(rank() over ( at client__iacode.ia_code order by XCOUNT(client_document.client_document_id  for client__iacode.ia_code ) desc nulls last)  at client__iacode.ia_code  order by rank() over ( at client__iacode.ia_code order by XCOUNT(client_document.client_document_id  for client__iacode.ia_code ) desc nulls last) asc,client__iacode.ia_code asc,client__iacode.ia_short_descr asc ) <= 25)
order by
       Rank_IA asc,
       IA_Code asc,
       IA_Short_Descr asc

这里是来自 IBM Cognos 报告工作室的本机 SQL 查询:

select "client__iacode"."ia_code" AS "C0", "client_documen

    t"."client_document_id" AS "C1", "client__iacode"."ia_short_descr" AS "C2", "client"."client_id" AS "C3", "client"."client_code" AS "C4"
    
    from ((((("dbo"."client" "client" INNER JOIN "dbo"."broker" "client__broker" on "client"."broker_id" = "client__broker"."broker_id") INNER JOIN "dbo"."ia_code" "client__iacode" on "client"."ia_code_id" = "client__iacode"."ia_code_id") INNER JOIN "dbo"."client_document" "client_document" on "client"."client_id" = "client_document"."client_id") INNER JOIN "dbo"."client_status" "client_status" on "client"."client_status_id" = "client_status"."client_status_id") INNER JOIN "dbo"."provider" "client__provider" on "client__provider"."provider_id" = "client"."provider_id") LEFT OUTER JOIN "dbo"."branch" "client__iacode__branch" on "client__iacode"."branch_id" = "client__iacode__branch"."branch_id"
    
    where  NOT "client_document"."requested_date" is null and "client_document"."received_date" is null and "client__iacode__branch"."branch_descr" = CAST( @BRANCH AS VARCHAR( 255 ) ) and "client__broker"."broker_code" = 'CCC' and "client_status"."client_status_code" = 'A' and ("client__provider"."provider_code" <> 'PRS-R' or "client__provider"."provider_code" is null)

这里是我到目前为止创建的 Microsoft SQL Server 查询,但它没有向我显示预期的结果:

select L1.*
from
(
select        L.Rank_IA,
              L.IA_Code,
              L.IA_Short_Descr,
              L.Doc_Count,
              L.Client_Count,
              L.[Rank],
              (count   (L.Condition) over( order by L.Condition asc, L.IA_Code asc, IA_Short_Descr asc )) as Condition
              from
              (
select
       rank() over (  order by COUNT(client_document.client_document_id    ) desc  )  as  Rank_IA,
       client__iacode.ia_code  as  IA_Code,
       client__iacode.ia_short_descr  as  IA_Short_Descr,
       COUNT( client_document.client_document_id   )  as  Doc_Count,
       COUNT(client.client_code   )  as  Client_Count,
      (rank() over (  order by COUNT( client.client_id   ) desc ) )  as [Rank],
      rank() over (  order by COUNT(  client_document.client_document_id   ) desc ) as Condition 
      --XSUM(XCOUNT(client_document.client_document_id  for client__iacode.ia_code,client__iacode.ia_short_descr )  at client__iacode.ia_code,client__iacode.ia_short_descr )  as  Total_Doc_Count_,
      --XSUM(XCOUNT(client.client_code  at client__iacode.ia_code,client__iacode.ia_short_descr,client.client_id  for client__iacode.ia_code,client__iacode.ia_short_descr )  at client__iacode.ia_code,client__iacode.ia_short_descr )  as  Total_Client_Count_
from
       (
           dbo.client client
           join
           dbo.broker client__broker
           on (client.broker_id = client__broker.broker_id)
           join
           dbo.ia_code client__iacode
           on (client.ia_code_id = client__iacode.ia_code_id)
           join
           dbo.client_document client_document
           on (client.client_id = client_document.client_id)
           join
           dbo.client_status client_status
           on (client.client_status_id = client_status.client_status_id)
           join
           dbo.provider client__provider
           on (client__provider.provider_id = client.provider_id)
       )
       left outer join
       dbo.branch client__iacode__branch
       on (client__iacode.branch_id = client__iacode__branch.branch_id)
where
       (client_document.requested_date is not NULL) and
       (client_document.received_date is NULL) and
       (client__iacode__branch.branch_descr = CAST(@BRANCH AS varchar(255))) and
       (client__broker.broker_code = 'CCC') and
       (client_status.client_status_code = 'A') and
       ((client__provider.provider_code <> 'PRS-R') or (client__provider.provider_code is NULL))
group by
       client__iacode.ia_code,
       client__iacode.ia_short_descr)L)L1
--filter
--      (rank() over ( at client__iacode.ia_code order by XCOUNT(client.client_code  at client__iacode.ia_code,client.client_id  for client__iacode.ia_code ) desc nulls last) <= 25) and
--      (RCOUNT(rank() over ( at client__iacode.ia_code order by XCOUNT(client_document.client_document_id  for client__iacode.ia_code ) desc nulls last)  at client__iacode.ia_code  order by rank() over ( at client__iacode.ia_code order by XCOUNT(client_document.client_document_id  for client__iacode.ia_code ) desc nulls last) asc,client__iacode.ia_code asc,client__iacode.ia_short_descr asc ) <= 25)
where L1.[Rank] <=25
and L1.Condition<=25
order by
       Rank_IA asc,
       IA_Code asc,
       IA_Short_Descr asc

您能否帮我在 Microsft SQL Server 代码中应用该过滤器。 提前感谢您的帮助。

【问题讨论】:

    标签: sql sql-server cognos cognos-10 cognos-bi


    【解决方案1】:

    在 Cognos 查询上生成 SQL 时,它将同时显示 Cognos SQL 和 Native SQL。 Cognos SQL 是报告所需的内容,而 Native SQL 是发送到数据库的内容。如果没有本地处理并且两种 SQL 类型在合理范围内相同,则您应该能够使用 Native SQL 对话框中的 SQL 而无需任何编辑。

    【讨论】:

    • Cognos 报告使用过滤器窗口。这就是过滤器不出现在原生 SQL 代码中的原因。
    • 不确定您的意思,您是在运行报告然后在交互式查看器中过滤吗?
    • 可能应该早点问这个问题,您使用的是什么 Cognos 产品?
    • 项目不在本机 SOL 中的唯一原因是产品认为它需要在本地执行,可能是由于数据库不支持它。我必须并排查看报告的本机 SQL 和 cognos SQL。
    • 查看stackoverflow.com/questions/17892574/… 看看是否有帮助
    【解决方案2】:

    在此处创建过滤器。 过滤器未显示在本机 SQL 查询中。

    【讨论】:

      【解决方案3】:

      Cognos BI 默认使用“动态查询模式”(从 10.2.1 开始)。它基本上是 Cognos 的查询引擎。引擎计划执行可能包括在从数据源接收到数据之后在本地处理数据。您可以在此处阅读 IBM 的免费红皮书

      http://www.redbooks.ibm.com/redbooks/pdfs/sg248121.pdf

      Here is a quick overview of the engine

      因此,这意味着本机查询并不是全部。 Cognos 在接收到来自 MS SQL 的数据后可能会做更多的处理。话虽如此,如果您想在 MS SQL 中复制相同的查询,则需要自己完成缺失的逻辑。如果 Cognos 中的多维模型以 1:1 映射到 MS SQL 关系数据库,那应该很容易(自己将 Cognos SQL 中缺少的部分转换为 MS SQL)。很多时候,Cognos 中的模型可能不会 1:1 映射到 MS SQL 表/列,这并不是那么直接。在这种情况下,在将 Cognos 查询转换为 MS SQL 查询 b/c 时,您需要了解 Cognos 内部的模型,这是本机查询和 Cognos 查询之间发生的事情的一部分。

      我对您的模型部分没有任何帮助,但对于其余部分,您可以先尝试将查询(或数据源)的“汇总处理”属性更改为“数据库”。这应该有助于将扩展聚合函数(XCOUNT 等)转换为本机 SQL。还要检查“使用 SQL 参数”属性并将其设置为“文字”,看看这是否有助于原生 SQL 中的参数。

      Screenshot of the properties window

      rank() 函数语法与 MS SQL 中的语法几乎相同,因此一旦处理了扩展函数,您应该能够轻松处理它。但我会先看看新的原生查询。

      RCount(运行计数)也可以在 MS SQL 中使用窗口函数轻松处理(参见下面的链接)。但同样,首先生成新的原生查询,然后查看 RCount 是否消失。

      https://docs.microsoft.com/en-us/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-ver15

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-18
        • 1970-01-01
        • 2017-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多