2012-04-09 35 views
0

我對於使用SQL非常新,而且我一直無法找到似乎回答我的問題的任何以前的帖子。我需要一份聲明,該聲明將爲我提供數據庫中每個客戶的最新批准提交以及與該提交相關聯的所有行/列數據。每個提交都被分配一個唯一的ID號,並且位於一個名爲ASMT_ID的列中。唯一的客戶ID號碼是一個名爲PRTPT_ID的列。SQL開發人員爲每個ID選擇最大記錄和整行

因此,對於數據庫T_FINANCIAL_ITEM中的每個PRTPT_ID,我希望爲每個客戶找到MAX ASMT_ID,並顯示與每個PRTPT_ID相關的所有列和行數據,但前提是STTS_NAME等於「Approved」。

在我簡單的說我想要做的事:

select * from T_FINANCIAL_ITEM 
For each PRTPT_ID SELECT MAX ASMT_ID 
WHERE STTS_NAME = 'Approved' 
GROUP by PRTPT_ID 

* UPDATE * 而不是使用asmt_id,我將需要分析在同一個表FYE_DT其他兩個字段和SUBM_TYPE。

的標準是:

  1. 最近FYE_DT與 '已批准'(即2011 2010之前)一個stts_name。
  2. 在最近fye_dt,經審計的subm_type
  3. 在最近fye_dt,如果他們沒有審計subm_type,未經審計的subm_type
  4. 這將拉動與提交會議有關的所有數據行的標準

例如:

PRTPT_ID ASMT_ID FYE_DT      SUBM_TYPE_NAME 
8493000000 18016 30-JUN-09 12.00.00.000000000 AM Unaudited/A-133 
8493000000 19574 30-JUN-09 12.00.00.000000000 AM Audited/A-133 
8493000000 28039 30-JUN-10 12.00.00.000000000 AM Unaudited/A-133 
8493000000 33620 30-JUN-10 12.00.00.000000000 AM Audited/A-133 
9481000000 38049 31-DEC-10 12.00.00.000000000 AM Unaudited/Non-A133 
9481000000 58020 31-DEC-09 12.00.00.000000000 AM Audited/Non-A-133 
9481000000 48139 31-DEC-11 12.00.00.000000000 AM Unaudited/Non-A-133 

結果:

PRTPT_ID ASMT_ID FYE_DT      SUBM_TYPE_NAME 
8493000000 33620 30-JUN-10 12.00.00.000000000 AM Audited/A-133 
9481000000 48139 31-DEC-11 12.00.00.000000000 AM Unaudited/Non-A-133 

注意:可能有多行數據與這些結果相關聯。我需要擁有所有的數據行。

+1

你使用什麼數據庫?標題中的「SQL Developer」是否暗示您正在使用Oracle數據庫和Oracle SQL Developer前端? – 2012-04-09 17:37:01

+1

SQL有哪些風味? MSSQL/MYSQL /甲骨文等? – Bridge 2012-04-09 17:37:03

+0

@JustinCave是的,我使用的Oracle SQL Developer前端 – 2012-04-09 18:18:29

回答

2

一個相對標準的方法是使用分析函數。如果我理解你的更新,聽起來像你想要ORDER BY子句是類似於

select * 
    from (select t.*, 
       rank() over (partition by prtpt_id 
             order by fye_dt desc, 
               (case when subm_type_name like 'Audited%' 
                then 2 
                when subm_type_name like 'Unaudited%' 
                then 1 
                else 0 
                end) desc) rnk 
      from t_financial_item t 
     where stts_name = 'Approved') 
where rnk = 1 
+0

您的第一種方法似乎可行,但它只能引入一個最大記錄的數據行。我需要與最大記錄相關的所有數據行。 – 2012-04-09 19:15:21

+0

@Craig_C - 我更新了我的答案,使用'rank'函數而不是'row_number'。如果可以有多個具有相同'asmt_id'的行,那麼將返回多行。不過,對我而言,這聽起來像是你描述中的一個獨特價值,所以我不確定如何存在重複的行。如果我的編輯不能幫助您,那麼發佈一些示例數據和預期輸出會很有幫助,以便我們能夠更好地爲您提供幫助。 – 2012-04-09 19:18:34

+0

asmt_id代表一個獨特的提交,但在每個提交下有幾個程序報告。每個程序都在不同的行上報告,這就是爲什麼我需要所有行。

您的修改聲明完美無缺。但是,我發現了一個新的轉折點。
2012-04-09 19:45:26

0

什麼是你的表格結構?這似乎是你在找什麼:

select MAX(ASMT_ID),PRTPT_ID from PRTPT_ID_TABLE p 
    INNER JOIN ASMT_ID_TABLE a on p.PRTPT_ID = a.PRTPT_ID 
    WHERE STTS_NAME = 'Approved' 
    GROUP by PRTPT_ID 

但我沒有看到任何表。 T_FINANCIAL_ITEM是表格還是數據庫名稱?

+0

T_FINANCIAL_ITEM是我進入下面的語句表名 – 2012-04-09 18:19:37

+0

:選擇MAX(ASMT_ID),PRTPT_ID從T_FINANCIAL_ITEM WHERE STTS_NAME = '批准' GROUP由PRTPT_ID;它看起來像找到了最大記錄,但它並沒有爲每個PRTPT_ID拉入數據的所有行/列數據 – 2012-04-09 18:31:22

+0

您需要自行加入表格,然後 – dfb 2012-04-09 18:48:05