【问题标题】:Issue writing a query in sql and implementing it in Webi report在 sql 中编写查询并在 Webi 报告中实现它
【发布时间】:2018-05-03 17:36:05
【问题描述】:

我正在尝试在 sql 中执行查询以仅获取与多个描述关联的代理记录

示例: 表名:代理

AGENCY_ID   PRODUCT_DESC  AGENT number
100            ABC        2000
101            ABC        2001
101            XYZ        2002
102            XYZ        2003

AGENCY_ID 101 有 ABC 和 XYZ 描述。从表中,我只想从重叠机构中提取记录

在上述情况下,我只想拉取:

AGENCY_ID   PRODUCT_DESC  AGENT number
101         ABC           2001
101         XYZ           2002

我也在尝试在业务对象 webi 报告查询过滤器中执行此操作。

请建议我解决我的问题。

提前致谢!

【问题讨论】:

  • 请提供示例数据、您尝试过的代码、您的表架构和预期结果
  • 标记您正在使用的 DBMS(MySQL、SQL Server 等)。

标签: sql business-objects webi


【解决方案1】:

SQL中你可以使用subquery

select t.*
from table t
where exists (select 1 from table  where AGENCY_ID = t.AGENCY_ID and PRODUCT_DESC <> t.PRODUCT_DESC);

大多数DBMS 不适用于&lt;&gt;,因此请改用!=,以防万一。

【讨论】:

    【解决方案2】:

    一种方式

    DECLARE @tblActivity AS TABLE (AGENCY_ID INT , PRODUCT_DESC VARCHAR(100), AGENTnumber INT)
    INSERT INTO @tblActivity (Agency_id,Product_Desc,AGentNumber)
    VALUES
    (100,'ABC', 2000),
    (101,'ABC', 2001),
    (101,'XYZ', 2002),
    (102,'XYZ', 2003)
    
    SELECT tmp.*
    FROM @tblActivity tmp 
    INNER JOIN @tblActivity tmp1 ON tmp1.AGENCY_ID = tmp.AGENCY_ID
                          AND tmp1.AGENTnumber != tmp.AGENTnumber
                          AND tmp1.PRODUCT_DESC != tmp.PRODUCT_DESC
    

    【讨论】:

      【解决方案3】:

      或者,如果您的 RDBMS 支持窗口/分析函数;可以获取重复 agent_ID 的计数,然后将该计数用作过滤器。

      示例:这里的 cte 只是在 Hana 数据库中设置数据,所以我使用 from dummy 来获取一个名为 CTE 的派生表。

      然后我们在带有 count() 分析的子查询中使用该派生表,以按代理 ID 获取记录计数,然后显示所有此类记录,其中计数 > 1

      需要一个子查询/内联视图,因为我们需要先生成 CNT 结果,然后才能对其进行限制;并且不能在 have / where 子句中使用分析/窗口函数。

      With CTE (AGENCY_ID,PRODUCT_DESC,AGENT_number) AS (
      SELECT 100,            'ABC',        2000 from dummy union all
      SELECT 101,            'ABC',        2001 from dummy union all
      SELECT 101,            'XYZ',        2002 from dummy union all
      SELECT 102,            'XYZ',        2003 from dummy)
      
      SELECT B.* 
      FROM (SELECT *, count(*) over (partition by Agency_ID) cnt 
            FROM CTE) B
      WHERE cnt > 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多