2017-10-24 9 views
0

SQL Serverでそのクエリを実行中に誰かが私を助けてもらえますか重複レコードがあります。私は& BILL_DETAILIDの両方のシナリオで内部結合を残してみましたが、私は重複レコード&も使用していますが、 "別個"を使用しても同じ問題に直面しています。私はこれを取り除きたい。SQLクエリから重複レコードを取得する

enter image description here

SELECT 
    BILL_DETAIL.id AS BILLDETAILID, 
    BILL_HEADER.id AS BILLHEADERID, 
    adjustment.id adjustmentID 
FROM 
    BILLHEADER 
INNER JOIN 
    BILL_DETAIL ON BILL_DETAIL.billdetail2billhdr = BILLHEADER.id 
LEFT JOIN 
    adjustment ON adjustment.adjustment2bill_detail = BILLDETAIL.id 
INNER JOIN 
    incident ON incident.case2billhdr = BILLHEADER.id 
+0

ここでは、必要なデータベースのみをタグ付けします。 mysql <> sql-server。そして、2つは、 'bill_detailid'と' bill_headid'が同じであるように見えるので、より大きいか小さいadjustIDが必要ですか? – Simon

+0

いいえ、私はちょうど "Bill_DetailID"ごとに1つのレコードを取得したいと思っています。 – Shilpi

+0

'BILL_DETAIL_ID = 697843'には' adjustmentID = 39842,39843'があります。これらの2つの値のどちらを返すのですか? –

答えて

0

のための最初のadjustment.idを返します。この

WITH CTE 
AS 
(
    select 
    SeqNo = ROW_NUMBER() OVER(PARTITON BY BILL_DETAIL.id,BILL_HEADER.id ORDER BY adjustment.id DESC), 
    BILL_DETAIL.id as BILLDETAILID, 
    BILL_HEADER.id as BILLHEADERID, 
    adjustment.id adjustmentID 
    from BILLHEADER 
    Inner JOIN BILL_DETAIL ON BILL_DETAIL.billdetail2billhdr=BILLHEADER.id 
    left join adjustment on adjustment.adjustment2bill_detail=BILLDETAIL.id 
    inner join incident on incident.case2billhdr=BILLHEADER.id 
) 
SELECT 
    * 
    FROM CTE 
    WHERE SeqNo = 1 

をお試しくださいもう一度試してみてください:

select 
    BILL_DETAIL.id as BILLDETAILID, 
    BILL_HEADER.id as BILLHEADERID, 
    MAX(adjustment.id) as adjustmentID 
from BILLHEADER 
Inner JOIN BILL_DETAIL ON BILL_DETAIL.billdetail2billhdr=BILLHEADER.id 
left join adjustment on adjustment.adjustment2bill_detail=BILLDETAIL.id 
inner join incident on incident.case2billhdr=BILLHEADER.id 
group by BILL_DETAIL.id,BILL_HEADER.id 

select billdetailid, 
     billheadid, 
     adjustmentid 
from 
(SELECT 
    BILL_DETAIL.id AS BILLDETAILID, 
    BILL_HEADER.id AS BILLHEADERID, 
    adjustment.id adjustmentID, 
    row_number() over(partition by bill_detail.id, bill_header.id order by adjustment.id desc) rn 
FROM 
    BILLHEADER 
INNER JOIN 
    BILL_DETAIL ON BILL_DETAIL.billdetail2billhdr = BILLHEADER.id 
LEFT JOIN 
    adjustment ON adjustment.adjustment2bill_detail = BILLDETAIL.id 
INNER JOIN 
    incident ON incident.case2billhdr = BILLHEADER.id) t1 
where t1.rn = 1 
+0

私はGroup by節なしではできません。 – Shilpi

+0

これは、私の質問を一瞬更新するつもりです。 – Simon

+0

@ Shilpi私は、クエリを更新しました、これはトリックを行う必要があります。将来的に可能な限り多くの詳細を提供してください。 – Simon

0

これは私が何を」理解だと思う各BILL_DETAIL.id + BILL_HEADER.idの組み合わせ

+0

'OVER'節の中には、最初に' PARTITION BY'と 'ORDER BY'が続きます。 –

+0

また、彼は最大の 'adjustmentid'を望んでいるので、' order by desc'をしたいと思っています。 – Simon

+0

私は訂正をしました。ありがとう、Giorgos BetsosとSimon –

0

このスクリプトを試してください。

SELECT 
    BILL_DETAIL.id AS BILLDETAILID, 
    BILL_HEADER.id AS BILLHEADERID, 
    adjustment.id adjustmentID 
FROM 
    BILLHEADER 
INNER JOIN 
    incident ON incident.case2billhdr = BILLHEADER.id 
INNER JOIN 
    BILL_DETAIL ON BILL_DETAIL.billdetail2billhdr = BILLHEADER.id 
LEFT JOIN 
    adjustment ON adjustment.adjustment2bill_detail = BILLDETAIL.id 
INNER JOIN (
    SELECT MAX(adjustment.id) AS maxAdjustmentId, BILLDETAIL.id as BILLDETAIL_id FROM BILLDETAIL 
    INNER JOIN adjustment ON adjustment.adjustment2bill_detail = BILLDETAIL.id 
    GROUP BY BILLDETAIL.id 
) AS maxAdjusment on maxAdjusment.BILLDETAIL_id = BILLDETAIL.id AND maxAdjusment.maxAdjustmentId = adjustment.id 
+0

このスクリプトがどのように動作するかを簡単に説明すると、この回答がより広範に役立ちます。 – Austen

関連する問題