【问题标题】:linking the query in the select statement在 select 语句中链接查询
【发布时间】:2013-12-19 00:39:51
【问题描述】:

From the query i am able to return the output as expected ..

是否可以使用 select 语句在下面标记的引号中编写相同的查询:

SELECT ACC.ACCOUNT_NUM AS ACCOUNT_NUMBER,
   ACC.ACCOUNT_NAME AS ACCOUNT_NAME,
   ADR.ADDRESS_1 AS BUILDING_TYPE,
   ACC.CUSTOMER_REF AS CUSTOMER_ID,
   CAT.BC AS BILL_CYCLE,
   CES.EVENT_SOURCE AS TELEPHONE_NUMBER,
   AAT.PACKAGE_NAME AS PROMO_PACKAGE,
   PRD.PRODUCT_NAME AS SERVICES,
   (SELECT COUNT (DISTINCT (EVENT_SOURCE))
      FROM CUSTEVENTSOURCE CES1
     WHERE CES1.CUSTOMER_REF = ACC.CUSTOMER_REF AND END_DTM IS NULL)
      AS TOTAL_NUMBER,
   ("SELECT LISTAGG (EVENT_SOURCE, ', ')
              WITHIN GROUP (ORDER BY EVENT_SOURCE)
      FROM CUSTEVENTSOURCE
     WHERE CUSTOMER_REF = ACC.CUSTOMER_REF AND END_DTM IS NULL")
      AS ALL_IPHONE_NUMBERS,
   CUS.COMPANY_NAME AS COMPANY_NAME,
      ADR.ADDRESS_1
   || ' '
   || ADR.ADDRESS_2
   || ' '
   || ADR.ADDRESS_3
   || ' '
   || ADR.ADDRESS_4
   || ' '
   || ADR.ADDRESS_5
      AS BILLING_ADDRESS,
   (SELECT ADR.ADDRESS_1
      FROM ADDRESS ADR
     WHERE ADR.CUSTOMER_REF = ACC.CUSTOMER_REF
           AND ADDRESS_SEQ IN
                  (SELECT ADDRESS_SEQ
                     FROM CUSTPRODUCTADDRESS CPA
                    WHERE CPA.CUSTOMER_REF = ADR.CUSTOMER_REF
                          AND PRODUCT_SEQ IN
                                 (SELECT PRODUCT_SEQ
                                    FROM CUSTPRODUCTSTATUS CPS
                                   WHERE CPS.CUSTOMER_REF =
                                            CPA.CUSTOMER_REF
                                         AND EFFECTIVE_DTM =
                                                (SELECT MAX (
                                                           EFFECTIVE_DTM)
                                                   FROM CUSTPRODUCTSTATUS CPS1
                                                  WHERE CPS1.CUSTOMER_REF =
                                                           CPS.
                                                            CUSTOMER_REF))))
      AS INSTALLATION_ADDRESS,
   (SELECT ACS.EFFECTIVE_DTM
      FROM ACCOUNTSTATUS ACS
     WHERE ACS.ACCOUNT_NUM = ACC.ACCOUNT_NUM
           AND ACS.EFFECTIVE_DTM =
                  (SELECT MAX (EFFECTIVE_DTM)
                     FROM ACCOUNTSTATUS ACS1
                    WHERE ACS1.ACCOUNT_NUM = ACS.ACCOUNT_NUM
                          AND ACCOUNT_STATUS = 'OK'))
      AS ACTIVATION_DATE,
   (SELECT ACS.ACCOUNT_STATUS
      FROM ACCOUNTSTATUS ACS
     WHERE ACS.ACCOUNT_NUM = ACC.ACCOUNT_NUM
           AND ACS.EFFECTIVE_DTM =
                  (SELECT MAX (EFFECTIVE_DTM)
                     FROM ACCOUNTSTATUS ACS1
                    WHERE ACS1.ACCOUNT_NUM = ACS.ACCOUNT_NUM))
      AS ACCOUNT_STATUS,
   (SELECT ACS.STATUS_REASON_TXT
      FROM ACCOUNTSTATUS ACS

你能帮帮我吗..我是 sql 新手..请

提前谢谢..

以上需要在""双引号内改 输出如下:

ACCOUNT_NUMBER     ACCOUNT_NAME  BUILDING_TYPE  CUSTOMER_ID  TELEPHONE_NUMBER  PROMO_PACKAGE TOTAL_NUMBER   ALL_IPHONE_NUMBERS,

MTX000110       John             xxxx            10002         123456     yyy    3   001-003,004,007

如果帐户有 3 个totoal_number,则在 All_iphone_numbers 列中,如果值具有序列号,则应使用“-”分隔符,否则必须显示数字

如果我使用“”双引号数组..我得到的输出是逗号分隔值,结果不正确..结果应该看起来像“如果值有序列号,那么它应该'-'否则带有分隔符它必须显示数字”。

【问题讨论】:

  • 我愿意提供帮助,但是查询太复杂了,这个问题对我来说没有任何意义。感谢 sqlfiddle,现在你能告诉我你想做什么不同的事情吗?也许,给我看一些示例输出或解释一下 sqlfiddle 有什么不同(或相同)?
  • @JoeLove:我已经编辑了 qurey,请查看..并请帮助我解决问题..
  • 您使用的是什么数据库类型。我最熟悉 oracle 和 postgress,看起来您正在使用其他东西。
  • 我使用的是 11 版本的 oracle
  • 从查询中去掉双引号会发生什么?你得到一个错误或只是不正确的结果?

标签: sql oracle11g


【解决方案1】:

试试这个:(注意:我没有11G R2,所以我用wm_concat测试,不支持,但是如果你有11G R2,那就用LISTAGG)

WITH TABIBITOSAN
    AS (SELECT
             ACCOUNT_REF,
             "number",
             TO_NUMBER ( "number" )
             - ROW_NUMBER ( ) OVER (ORDER BY TO_NUMBER ( "number" ))
                 AS GRP
        FROM
             TBL),
    DATASET1
    AS (SELECT
             ACCOUNT_REF,
             CASE
                 WHEN MIN ( "number" ) = MAX ( "number" )
                 THEN
                     MIN ( "number" )
                 ELSE
                        MIN ( "number" )
                     || '-'
                     || MAX ( "number" )
             END
                 AS RANGES
        FROM
             TABIBITOSAN
        GROUP BY
             ACCOUNT_REF,
             GRP
        ORDER BY
             ACCOUNT_REF,
             MIN ( "number" ))
SELECT
      ACCOUNT_REF,
      WM_CONCAT ( RANGES ) AS NEW_RANGES
FROM
      DATASET1
GROUP BY
      ACCOUNT_REF;

结果:

101 002-004,006-008,011

使用 LISTAGG

SELECT
      ACCOUNT_REF,
      LISTAGG ( RANGES,
              ',' )
      WITHIN GROUP (ORDER BY RANGES)
          AS NEW_RANGES
FROM
      DATASET1
WHERE
      ACCOUNT_REF = ACC.ACCOUNT_REF
GROUP BY
      ACCOUNT_REF

【讨论】:

  • 我可以在“select”语句中使用格式(你给出的)吗??因为在这里我不应该使用任何函数……为了实现这个……框架将不支持函数的用法..
  • 真的很困惑。放置准确的场景,重写您的问题,添加您需要查看的输入和准确的输出,更重要的是分享您目前使用的相关 sn-ps
  • 我想用你在我的查询中给出的相同的东西来代替选择查询的双“”引号。
  • select ACC.ACCOUNT_NUM AS ACCOUNT_NUMBER,.....with TABIBITOSAN AS (SELECT ACCOUNT_REF, "number", TO_NUMBER ("number") - ROW_NUMBER () OVER (ORDER BY TO_NUMBER ("number" ))) 有可能吗??
  • 应该是WITH X AS (SELECT SOMETHING), Y AS (SELECT * FROM X) SELECT FROM X,Y; 所以你可以在最后一次选择时使用sn-p,而不是在CTE中。
猜你喜欢
  • 2013-12-06
  • 2014-09-01
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
相关资源
最近更新 更多