2016-05-18 8 views
-2

私はINNER JOINとリンクする2つのテーブルを持っています。これらは請求書ヘッダテーブルと請求書ラインテーブルです。SQLクエリのカウンタ列

私が追加したいのは、一意の請求書番号ごとに1を与えるカウンタ列です。請求書に複数の明細がある場合は、重複した請求書番号が0になります。後でデータを分析するときに、Excelのさまざまな列でカウントを実行できるようになります。基本的にはカウントですが、右側のテーブルを無視して、左側のテーブルのレコードに対してのみ行います。

これを機能させるには、COUNT()またはCASEを使用する方法を理解できません。まったく可能ですか?

これが私のクエリです:

SELECT P.DocNum 
    , L.LineNum 
    , P.DocCur 
    , P.DocTotalFC 
    , P.DocTotal 
    , CASE 
     WHEN LEFT(L.AcctCode, 1) = '7' THEN 'Admin' 
     WHEN LEFT(L.AcctCode, 2) = '15' THEN 'Admin' 
     WHEN L.AcctCode = '11501'  THEN 'MX' 
     WHEN LEFT(L.Project, 1) = 'W' THEN 'MX' 
     WHEN L.OcrCode2 = '570'   THEN 'MEC' 
     WHEN L.OcrCode2 = '590'   THEN 'ZHU' 
     ELSE 'Flight Ops' 
     END AS 'Type' 
    , L.AcctCode AS 'Account' 
    , L.OcrCode AS 'Aircraft' 
    , L.OcrCode2 AS 'Department' 
    , L.OcrCode3 AS 'Business Unit' 
    , L.Project AS 'Project'    
    , L.LineTotal 
FROM OPCH P 
    INNER JOIN PCH1 L ON P.DocEntry = L.DocEntry 
WHERE P.DocDate BETWEEN '2016-01-01' AND '2016-03-31' 
ORDER BY P.DocNum, L.LineNum 

高く評価任意のヒント。

ありがとうございます。私は何が必要だと思う

+0

値?どのバージョンの 'SQL Server? –

+0

請求書番号はDocNumフィールドです。サーバーはSQL Server 2008です。Sagiのパーティション上のrow_numberはトリックを行います:) – Matth

答えて

2

ROW_NUMBER()ないCOUNT()です:

SELECT P.DocNum 
    , L.LineNum 
    , P.DocCur 
    , P.DocTotalFC 
    , P.DocTotal 
    , CASE 
     WHEN LEFT(L.AcctCode, 1) = '7' THEN 'Admin' 
     WHEN LEFT(L.AcctCode, 2) = '15' THEN 'Admin' 
     WHEN L.AcctCode = '11501'  THEN 'MX' 
     WHEN LEFT(L.Project, 1) = 'W' THEN 'MX' 
     WHEN L.OcrCode2 = '570'   THEN 'MEC' 
     WHEN L.OcrCode2 = '590'   THEN 'ZHU' 
     ELSE 'Flight Ops' 
     END AS 'Type' 
    , L.AcctCode AS 'Account' 
    , L.OcrCode AS 'Aircraft' 
    , L.OcrCode2 AS 'Department' 
    , L.OcrCode3 AS 'Business Unit' 
    , L.Project AS 'Project'    
    , L.LineTotal 
    , CASE WHEN ROW_NUMBER() OVER(PARTITION BY p.docnum ORDER BY p.docDate) > 1 
      then 0 
      else 1 
     end as rnk 
FROM OPCH P 
    INNER JOIN PCH1 L ON P.DocEntry = L.DocEntry 
WHERE P.DocDate BETWEEN '2016-01-01' AND '2016-03-31' 
ORDER BY P.DocNum, L.LineNum 

あなたはユニークな請求書番号である列を理解するのに十分な詳細を提供しなかった、と何列で、あなたが最初のものである誰dicide (値1)と重複(値0)を返します。請求書番号としてdocnumを使用し、重複を決定する列としてdocdateを使用し、必要に応じて調整します。

注文が問題ではない場合 - その合計の複製で、どのレコードが複製であるかは関係ありません。その場合、部品による注文は関係ありません。

+0

DocNumは、正しく想定されているように請求書番号です。 ありがとうございます。私はrow_number()関数を知っていましたが、 "パーティションバイ"トリックを知らなかった。素晴らしいです、ありがとう。 – Matth

1

私はROW_NUMBERとケースの条件を使用しているという仮定に基づいて正確なデータを知っていないとして、我々は重複のために正常値のための1と0を得ることができるものは、請求書番号です

SELECT P.DocNum 
    , L.LineNum 
    , P.DocCur 
    , P.DocTotalFC 
    , P.DocTotal 
    , CASE 
     WHEN LEFT(L.AcctCode, 1) = '7' THEN 'Admin' 
     WHEN LEFT(L.AcctCode, 2) = '15' THEN 'Admin' 
     WHEN L.AcctCode = '11501'  THEN 'MX' 
     WHEN LEFT(L.Project, 1) = 'W' THEN 'MX' 
     WHEN L.OcrCode2 = '570'   THEN 'MEC' 
     WHEN L.OcrCode2 = '590'   THEN 'ZHU' 
     ELSE 'Flight Ops' 
     END AS 'Type' 
    , L.AcctCode AS 'Account' 
    , L.OcrCode AS 'Aircraft' 
    , L.OcrCode2 AS 'Department' 
    , L.OcrCode3 AS 'Business Unit' 
    , L.Project AS 'Project'    
    , L.LineTotal 
    , CASE WHEN ROW_NUMBER()OVER(PARTITION BY P.DocNum,L.LineNum ORDER BY (SELECT NULL)) = 1 THEN 1 ELSE 0 END SummaryValues 
FROM OPCH P 
    INNER JOIN PCH1 L ON P.DocEntry = L.DocEntry 
WHERE P.DocDate BETWEEN '2016-01-01' AND '2016-03-31' 
ORDER BY P.DocNum, L.LineNum 
0
;with cte as (
    SELECT 
     a.DocEntry, joincounter = count(b.DocEntry) 
    FROM 
     OPCH P AS a 
     INNER JOIN PCH1 AS b ON a.DocEntry = b.DocEntry 
    group by a.DocEntry 
) 
SELECT 
    case 
     when cte.joincounter > 1 then 0 
     else cte.joincounter 
    end as joincounter 

    ,P.DocNum 
    , L.LineNum 
    , P.DocCur 
    , P.DocTotalFC 
    , P.DocTotal 
    , CASE 
     WHEN LEFT(L.AcctCode, 1) = '7' THEN 'Admin' 
     WHEN LEFT(L.AcctCode, 2) = '15' THEN 'Admin' 
     WHEN L.AcctCode = '11501'  THEN 'MX' 
     WHEN LEFT(L.Project, 1) = 'W' THEN 'MX' 
     WHEN L.OcrCode2 = '570'   THEN 'MEC' 
     WHEN L.OcrCode2 = '590'   THEN 'ZHU' 
     ELSE 'Flight Ops' 
    END AS 'Type' 
    , L.AcctCode AS 'Account' 
    , L.OcrCode AS 'Aircraft' 
    , L.OcrCode2 AS 'Department' 
    , L.OcrCode3 AS 'Business Unit' 
    , L.Project AS 'Project'    
    , L.LineTotal 
FROM 
    OPCH P 
    INNER JOIN PCH1 L ON P.DocEntry = L.DocEntry 
    inner join cte on cte.DocEntry = P.DocEntry 
WHERE 
    P.DocDate >= '2016-01-01' 
    AND P.DocDate < '2016-03-31' 
ORDER BY 
    P.DocNum, L.LineNum