2016-09-30 45 views
0

例如,我在查詢中只選擇了兩個修復引用。輸出顯示每個修復參考的許多記錄。對於每個修復可以有多個序列和每個序列有分配給它的(如下所示)一個交易人:減少和分組記錄並替換字段中的值

╔══════════════════╦══════════════╦══════════════╦════════════╦═══════════════╗ 
║ Repair Reference ║ Tenant Name ║ Job Sequence ║ Trade Code ║ Trade   ║ 
╠══════════════════╬══════════════╬══════════════╬════════════╬═══════════════╣ 
║   57257795 ║ MISS L SMITH ║   1 ║   41 ║ Plumber  ║ 
║   57257795 ║ MISS L SMITH ║   10 ║   40 ║ Plasterer  ║ 
║   57257795 ║ MISS L SMITH ║   11 ║   40 ║ Plasterer  ║ 
║   57257795 ║ MISS L SMITH ║   13 ║   40 ║ Plasterer  ║ 
║   57257795 ║ MISS L SMITH ║   14 ║   44 ║ Electrician ║ 
║   57257795 ║ MISS L SMITH ║   15 ║   44 ║ Electrician ║ 
║   57257795 ║ MISS L SMITH ║   17 ║   40 ║ Plasterer  ║ 
║   57257795 ║ MISS L SMITH ║   18 ║   41 ║ Plumber  ║ 
║   57257795 ║ MISS L SMITH ║   19 ║   41 ║ Plumber  ║ 
║   57257795 ║ MISS L SMITH ║   2 ║   41 ║ Plumber  ║ 
║   57257795 ║ MISS L SMITH ║   20 ║   32 ║ Joiner  ║ 
║   57257795 ║ MISS L SMITH ║   3 ║   40 ║ Plasterer  ║ 
║   57257795 ║ MISS L SMITH ║   5 ║   32 ║ Joiner  ║ 
║   57257795 ║ MISS L SMITH ║   6 ║   40 ║ Plasterer  ║ 
║   57257795 ║ MISS L SMITH ║   7 ║   40 ║ Plasterer  ║ 
║   57257795 ║ MISS L SMITH ║   8 ║   32 ║ Joiner  ║ 
║   57342819 ║ MISS A GREEN ║   1 ║   40 ║ Plasterer  ║ 
║   57342819 ║ MISS A GREEN ║   2 ║   40 ║ Plasterer  ║ 
║   57342819 ║ MISS A GREEN ║   3 ║   33 ║ Painter  ║ 
║   57342819 ║ MISS A GREEN ║   4 ║   33 ║ Painter  ║ 
║   57342819 ║ MISS A GREEN ║   5 ║   33 ║ Painter  ║ 
║   57342819 ║ MISS A GREEN ║   6 ║   40 ║ Plasterer  ║ 
╚══════════════════╩══════════════╩══════════════╩════════════╩═══════════════╝ 

客戶端只想要一個記錄每修復參考(如下所示例子)顯示 - 我可以使用Job_Sequence = 1來做到這一點。我遇到的問題是Trade顯示Multi Trade如果有多個Trade類型每Repair Reference。這正是我正在努力的。是否有可能看所有的Trades per Repair Reference,如果有多於一個類型,顯示文本多貿易否則,如果只有一個Trade/Trade CodeRepair Reference就用貿易,因爲它是:

╔══════════════════╦══════════════╦══════════════╦════════════╦══════════════╗ 
║ Repair Reference ║ Tenant Name ║ Job Sequence ║ Trade Code ║ Trade  ║ 
╠══════════════════╬══════════════╬══════════════╬════════════╬══════════════╣ 
║   57257795 ║ MISS L SMITH ║   1 ║   41 ║ Multi Trade ║ 
║   57342819 ║ MISS A GREEN ║   1 ║   40 ║ Multi Trade ║ 
╚══════════════════╩══════════════╩══════════════╩════════════╩══════════════╝ 

下面是目前我已經得到了SQL:

SELECT 
rhm_job_seqs.repair_ref AS "Repair Reference", 
rhm_repairs.tenant_name AS "Tenant Name", 
rhm_repairs.tenant_address1 AS "Tenant Address1", 
rhm_repairs.tenant_address2 AS "Tenant Address2", 
rhm_repairs.tenant_postcode AS "Tenant PostCode", 
rhm_job_seqs.job_seq AS "Job Sequence", 
rhm_trades.trade_code AS "Trade Code", 
rhm_trades.trade_desc AS "Trade" 
FROM (
RHM_REPAIRS 
INNER JOIN RHM_JOB_SEQS ON RHM_REPAIRS.REPAIR_REF = RHM_JOB_SEQS.REPAIR_REF) 
INNER JOIN RHM_OPERATORS ON RHM_JOB_SEQS.OPERATOR_ID1 = RHM_OPERATORS.OPERATOR_ID 
INNER JOIN rhm_repair_type ON rhm_repairs.repair_type = rhm_repair_type.repair_type 
INNER JOIN rhm_trades ON rhm_job_seqs.trade_code = rhm_trades.trade_code 
INNER JOIN rhm_subareas ON rhm_repairs.subarea_no = rhm_subareas.subarea_no 
INNER JOIN rhm_yhn_areas ON rhm_subareas.yhn_area_no = rhm_yhn_areas.area_no 
WHERE 
NOT (RHM_REPAIRS.TENANT_ADDRESS1 LIKE '9999Z' OR 
RHM_REPAIRS.TENANT_ADDRESS1 LIKE '9999z%' OR 
RHM_REPAIRS.TENANT_ADDRESS1 LIKE 'block' OR 
RHM_REPAIRS.TENANT_ADDRESS1 LIKE 'Block' OR 
RHM_REPAIRS.TENANT_ADDRESS1 LIKE 'Block%' OR 
RHM_REPAIRS.TENANT_ADDRESS1 LIKE 'BLOCK') 
AND NOT (RHM_REPAIRS.JOB_PRIORITY LIKE 'I' OR RHM_REPAIRS.JOB_PRIORITY LIKE 'V') 
AND (RHM_REPAIRS.REPAIR_TYPE LIKE '2' OR 
RHM_REPAIRS.REPAIR_TYPE LIKE 'G' OR 
RHM_REPAIRS.REPAIR_TYPE LIKE 'S' OR 
RHM_REPAIRS.REPAIR_TYPE LIKE 'X') 
AND RHM_REPAIRS.TENANT_NAME <> 'VOID' 
AND RHM_REPAIRS.TENANT_NAME <> 'Void' 
AND RHM_REPAIRS.TENANT_NAME IS NOT NULL 
AND RHM_JOB_SEQS.JOB_SEQ_STATUS <> 'X' 
AND rhm_repairs.repair_completed BETWEEN SYSDATE-20 AND SYSDATE 
AND RHM_REPAIRS.SUBAREA_NO <> '99' 
AND rhm_job_seqs.repair_ref IN ('57342819','57257795') 
AND rhm_job_seqs.job_seq = '1' 
ORDER BY 
RHM_JOB_SEQS.REPAIR_REF, rhm_job_seqs.job_seq 

回答

0

我想嘗試ROW_NUMBER()

select * from ( 
SELECT 
    rhm_job_seqs.repair_ref AS "Repair Reference", 
    rhm_repairs.tenant_name AS "Tenant Name", 
    rhm_repairs.tenant_address1 AS "Tenant Address1", 
    rhm_repairs.tenant_address2 AS "Tenant Address2", 
    rhm_repairs.tenant_postcode AS "Tenant PostCode", 
    rhm_job_seqs.job_seq AS "Job Sequence", 
    rhm_trades.trade_code AS "Trade Code", 
    rhm_trades.trade_desc AS "Trade", 
    row_number() over (partition by rhm_job_seqs.repair_ref order by rhm_job_seqs.repair_ref, rhm_job_seqs.job_seq) r 
    FROM (
    RHM_REPAIRS 
    INNER JOIN RHM_JOB_SEQS ON RHM_REPAIRS.REPAIR_REF = RHM_JOB_SEQS.REPAIR_REF) 
    INNER JOIN RHM_OPERATORS ON RHM_JOB_SEQS.OPERATOR_ID1 = RHM_OPERATORS.OPERATOR_ID 
    INNER JOIN rhm_repair_type ON rhm_repairs.repair_type = rhm_repair_type.repair_type 
    INNER JOIN rhm_trades ON rhm_job_seqs.trade_code = rhm_trades.trade_code 
    INNER JOIN rhm_subareas ON rhm_repairs.subarea_no = rhm_subareas.subarea_no 
    INNER JOIN rhm_yhn_areas ON rhm_subareas.yhn_area_no = rhm_yhn_areas.area_no 
    WHERE 
    NOT (RHM_REPAIRS.TENANT_ADDRESS1 LIKE '9999Z' OR 
    RHM_REPAIRS.TENANT_ADDRESS1 LIKE '9999z%' OR 
    RHM_REPAIRS.TENANT_ADDRESS1 LIKE 'block' OR 
    RHM_REPAIRS.TENANT_ADDRESS1 LIKE 'Block' OR 
    RHM_REPAIRS.TENANT_ADDRESS1 LIKE 'Block%' OR 
    RHM_REPAIRS.TENANT_ADDRESS1 LIKE 'BLOCK') 
    AND NOT (RHM_REPAIRS.JOB_PRIORITY LIKE 'I' OR RHM_REPAIRS.JOB_PRIORITY LIKE 'V') 
    AND (RHM_REPAIRS.REPAIR_TYPE LIKE '2' OR 
    RHM_REPAIRS.REPAIR_TYPE LIKE 'G' OR 
    RHM_REPAIRS.REPAIR_TYPE LIKE 'S' OR 
    RHM_REPAIRS.REPAIR_TYPE LIKE 'X') 
    AND RHM_REPAIRS.TENANT_NAME <> 'VOID' 
    AND RHM_REPAIRS.TENANT_NAME <> 'Void' 
    AND RHM_REPAIRS.TENANT_NAME IS NOT NULL 
    AND RHM_JOB_SEQS.JOB_SEQ_STATUS <> 'X' 
    AND rhm_repairs.repair_completed BETWEEN SYSDATE-20 AND SYSDATE 
    AND RHM_REPAIRS.SUBAREA_NO <> '99' 
    AND rhm_job_seqs.repair_ref IN ('57342819','57257795') 
    AND rhm_job_seqs.job_seq = '1' 
) where r = 1 
    ORDER BY 
    "Repair Reference", "Job Sequence" 
0

這可能是工作 - 基本上每一行,如果存在一些較高的工作序列,我會問:

SELECT 
    rhm_job_seqs.repair_ref AS "Repair Reference", 
    rhm_repairs.tenant_name AS "Tenant Name", 
    rhm_repairs.tenant_address1 AS "Tenant Address1", 
    rhm_repairs.tenant_address2 AS "Tenant Address2", 
    rhm_repairs.tenant_postcode AS "Tenant PostCode", 
    rhm_job_seqs.job_seq AS "Job Sequence", 
    rhm_trades.trade_code AS "Trade Code", 
    CASE WHEN EXISTS (
     SELECT * 
     FROM RHM_JOB_SEQS job_seqs2 
     WHERE rhm_job_seqs.repair_ref = job_seqs2.repair_ref 
      AND rhm_job_seqs.trade_code <> job_seqs2.trade_code 
      AND job_seqs2.job_seq > 1 
    ) 
    THEN 'Multi Trade' 
    ELSE rhm_trades.trade_desc 
    END AS "Trade" 
FROM RHM_REPAIRS 
INNER JOIN RHM_JOB_SEQS ON RHM_REPAIRS.REPAIR_REF = RHM_JOB_SEQS.REPAIR_REF 
INNER JOIN RHM_OPERATORS ON RHM_JOB_SEQS.OPERATOR_ID1 = RHM_OPERATORS.OPERATOR_ID 
INNER JOIN rhm_repair_type ON rhm_repairs.repair_type = rhm_repair_type.repair_type 
INNER JOIN rhm_trades ON rhm_job_seqs.trade_code = rhm_trades.trade_code 
INNER JOIN rhm_subareas ON rhm_repairs.subarea_no = rhm_subareas.subarea_no 
INNER JOIN rhm_yhn_areas ON rhm_subareas.yhn_area_no = rhm_yhn_areas.area_no 
WHERE 
    NOT (
     RHM_REPAIRS.TENANT_ADDRESS1 LIKE '9999Z' OR 
     RHM_REPAIRS.TENANT_ADDRESS1 LIKE '9999z%' OR 
     RHM_REPAIRS.TENANT_ADDRESS1 LIKE 'block' OR 
     /** RHM_REPAIRS.TENANT_ADDRESS1 LIKE 'Block' OR **/ 
     RHM_REPAIRS.TENANT_ADDRESS1 LIKE 'Block%' OR 
     RHM_REPAIRS.TENANT_ADDRESS1 LIKE 'BLOCK' 
    ) 
    AND NOT (RHM_REPAIRS.JOB_PRIORITY LIKE 'I' OR RHM_REPAIRS.JOB_PRIORITY LIKE 'V') 
    AND (
     RHM_REPAIRS.REPAIR_TYPE LIKE '2' OR 
     RHM_REPAIRS.REPAIR_TYPE LIKE 'G' OR 
     RHM_REPAIRS.REPAIR_TYPE LIKE 'S' OR 
     RHM_REPAIRS.REPAIR_TYPE LIKE 'X' 
    ) 
    AND RHM_REPAIRS.TENANT_NAME <> 'VOID' 
    AND RHM_REPAIRS.TENANT_NAME <> 'Void' 
    AND RHM_REPAIRS.TENANT_NAME IS NOT NULL 
    AND RHM_JOB_SEQS.JOB_SEQ_STATUS <> 'X' 
    AND rhm_repairs.repair_completed BETWEEN SYSDATE-20 AND SYSDATE 
    AND RHM_REPAIRS.SUBAREA_NO <> '99' 
    AND rhm_job_seqs.repair_ref IN ('57342819','57257795') 
    AND rhm_job_seqs.job_seq = '1' 
ORDER BY RHM_JOB_SEQS.REPAIR_REF, rhm_job_seqs.job_seq 

我也註釋掉無用狀態。

+0

嗨,謝謝你對我的問題的回覆 - 非常感謝。這看起來像我以後的事情。該解決方案几乎給了我想要的,但我在WHERE rhm_job_seqs.repair_ref = job_seqs2.repair_ref AND job_seqs2.job_seq> 1之間添加了'和rhm_job_seqs.trade_code <> job_seqs2.trade_code',它給了我所需要的結果。我已經離開了辦公室好幾天了,因此我遲了回覆 - 但是非常感謝您花時間幫我整理我的查詢/數據摘錄。 –