2017-08-10 6 views
0

私は2つの別のクエリがあります。 1つは詳細ファイル用、もう1つはエンド/トレーラーファイル用に使用しています(ヘッダファイルもありますが、この質問には関係ありません)。私はこれらが別の列を返すので、別々にしておく必要があります。2つの異なるクエリ。 1つは、他から行を数える必要があります

問題はディテールファイルに13,470行ありますが、セカンダリクエリ(トレイラーファイル)でカウントすると13207行になります。その理由は、いくつかのアイテムには、プライマリアイテムIDに関連付けられた複数のセカンダリIDがあるからです。

SELECT DISTINCTを使用しない場合、同じ数が得られますが、25,250行が返されます。私は自分の詳細ファイルから複製を保持する必要があります。

詳細クエリは非常に長いですが、ALMOSTのすべてのレコードが一意であっても、プライマリアイテムIDがプライマリアイテムのいくつかの異なる値を持つ可能性があるため、 ID。

私は以下の記事を読んだが、それを動作させることはできないようだ。私は、Microsoft SQL Server 2012のではなくMySQLを使用していますことに注意してください、私は記事のいずれかで説明した私のニーズにMySQLのの概念を適用しなかった:

Multiple COUNT() for multiple conditions in one query (MySQL)

SUM of grouped COUNT in SQL Query

Counting Values based on distinct values from another Column

再度、詳細ファイルで指定したすべての基準(数十列と13,470行)に基づいてカウントを取得したいと考えています。私のトレーラーファイルは2列と1行だけです。 1つは終了/予告ファイルであることを識別し、もう1つは詳細ファイルによって返されるべきレコードの数を表示します。

がここにあります私の「ちょうど試してみて、この作品または右パス上にあるかどうかを確認し、」クエリ(とそうでない):

SELECT DISTINCT 
    CAST('TRL' AS VARCHAR(3)) AS RECID, 
    (CASE 
     WHEN COUNT(I2.VNDRITNM) > COUNT(DISTINCT I2.ITEMNMBR) 
     THEN COUNT(I2.VNDRITNM) 
     WHEN COUNT(I2.VNDRITNM) = COUNT(DISTINCT I2.ITEMNMBR) 
     THEN COUNT(I2.ITEMNMBR) 
     ELSE COUNT(DISTINCT I2.ITEMNMBR) 
    END) AS TOTREC 
    FROM Inv00101 I 
    JOIN Inv00102 I2 ON I2.ITEMNMBR = I.ITEMNMBR 
    JOIN ItemUnit I3 ON I3.ITEMNMBR = I.ITEMNMBR 
    LEFT OUTER JOIN prodmaster D ON D.itemid = I.ITEMNMBR 
    LEFT OUTER JOIN productinfo I4 ON I4.ITEMNMBR = I.ITEMNMBR 
    WHERE (ITMDESC LIKE '%ART%' OR ITMDESC LIKE '%CRAFT%') 

これは25250行を返します。

もちろん、CASEのステートメントは間違っていますが、私はこれをオプションとして探求したかったのです。誰かが私の質問をどのように同期させることができるか、考えている人はいますか?再び

  • のMicrosoft SQL Server 2012の
  • 1ヘッダーファイル(作品)
  • 1つの詳細ファイル(作品)
  • 1トレーラーファイル(意図したとおりに動作していない)

予告編の結果はCASEです。

ただいずれかの列に DISTINCTをカウントの
| RECID | TOTREC | 
-------------------- 
1 | TRL | 25250 | 

トレーラー結果:

探し
| RECID | TOTREC | 
-------------------- 
1 | TRL | 13207 | 

| RECID | TOTREC | 
-------------------- 
1 | TRL | 13470 | 

は何かアドバイスをいただければ幸いです。ありがとう!

EDIT

は、ここでは詳細ファイルクエリですが、私は無関係な列を削除しました。私はこのクエリを実行し、それが非編集したクエリと同じように動作しますので、これは言うには十分良いことがあります:

SELECT DISTINCT 
    RTRIM(CAST('DTL' AS VARCHAR(3))) AS RECID, 
    RTRIM(CAST('12345' AS VARCHAR(10))) AS COMPANY, 
    RTRIM(CAST(CASE 
       WHEN I2.VNDITNUM = '' 
       THEN 'BLANK' 
       ELSE I2.VNDITNUM END AS VARCHAR(20))) AS VNDITEM, 
    RTRIM(CAST(I.ITEMNMBR AS VARCHAR(20))) AS NUMITEM, 
    RTRIM(CAST(I.ITEMDESC AS VARCHAR(60))) AS ITMDESC, 
    RTRIM(CAST(CASE 
      WHEN I.INACTIVE = '0' 
      THEN 'A' 
      WHEN I.INACTIVE = '1' 
      THEN 'I' END AS VARCHAR(1))) AS STATUS 
FROM Inv00101 I 
JOIN Inv00102 I2 ON I2.ITEMNMBR = I.ITEMNMBR 
JOIN ItemUnit I3 ON I3.ITEMNMBR = I.ITEMNMBR 
LEFT OUTER JOIN prodmaster D ON D.itemid = I.ITEMNMBR 
LEFT OUTER JOIN productinfo I4 ON I4.ITEMNMBR = I.ITEMNMBR 
WHERE (ITMDESC LIKE '%ART%' OR ITMDESC LIKE '%CRAFT%') 

VNDITNUMは、ベンダー/サプライヤーのIDであるのに対し、ITEMNMBRがプライマリ、内部IDであることに注意してください、私はセカンダリIDと呼んでいます。製品の一意の一次内部IDに対して複数のレコードを持つことがあるのはVNDITNUMです。次のように

正常な結果は次のようになります。

| RECID | COMPANY | VNDITEM | NUMITEM | ITMDESC | STATUS | 
------------------------------------------------------------ 
1 | DTL | 12345 | 011223 | 100234 | Game | A  | 
2 | DTL | 12345 | 015992 | 104722 | Picture | A  | 

しかし、ここではそれが重複する可能性があるかのように例です:あなたの「トレーラー」クエリがしか1つのレコードを返す場合

| RECID | COMPANY | VNDITEM | NUMITEM | ITMDESC | STATUS | 
------------------------------------------------------------ 
1 | DTL | 12345 | 029445 | 109777 | Book A | A  | 
2 | DTL | 12345 | 029478 | 109777 | Book A | A  | 
+0

あなたはこれらのクエリから実際のファイルを作成していますか?または、結果セットのみ。 – HLGEM

+0

@jderekc:あなたはあなた自身で質問に答えました。あなたはあなたの 'Detail'クエリで 'セカンダリID'を使っていますが、あなたは 'Trailer'クエリでそれを使っていません。 'セカンダリID'が 'Detail'クエリの選択基準の一部である場合、論理的には、同じカウントを得るために 'Trailer'クエリで'セカンダリID'が必要になります。 – abraxascarab

+0

2つ目のこと: 'Trailer'クエリが常に1レコードしか返さない場合は、 'Detail'クエリの直後に '@@ rowcount'というtsql関数を使用できます。次に、実際の行数を 'Trailer'に配置するだけです。 'DECLARE @rc as integer;'のように整数変数を宣言する必要があります。次に、 'Detail'クエリの後にrowcountを割り当てます: 'set @rc = @@ rowcount;'次に、Trailerクエリであなたの行数が必要な場所で@rc変数を使用してください。 – abraxascarab

答えて

1

.. 。あなたはこのようにTSQL機能に@@recordcount

を使用しようとすることができます:

-- Declare an integer variable 
DECLARE @rc as integer; 

-- Your Detail query 
SELECT 
    IDont 
    ,CareWhat 
    ,TheDetailLogicIs 
FROM 
    Inv00101 as i 
    JOIN WhoKnowsWhat as idk ON i.ITEMNMBR = idk.ITEMNMBR 
WHERE 
    Who = Cares; 

-- Assign your row count variable with the row count of the last executed query. 
SET @rc = @@rowcount; 

-- Your new Trailer query 
SELECT 
    'TRL' AS [RECID] 
    ,@rc AS [TOTREC]; 

これには、実際のクエリの行数をカウントするための追加の利点があります。さらに、時間がかかる重複したロジックを実行する必要はありません(特に、詳細クエリが複雑になる場合は特にそうです)。

私はまだ(1つのクエリでこれを行うことができませんでした別のクエリを維持し、別のフラットファイルを取り込むためにSSISを使用できるように役立ちます:)

+0

これは実際に動作します、ありがとう!私はこれを複数のファイルにエクスポートする方法はまだ分かりませんが、まだ試していません。 – jderekc

1

を私が派生テーブルを使用してこれを行う方法を見つけた希望UNIONを除いた複数のselect文を持つ)。私がそこに行くのを手伝ってくれてありがとう!あなたの提案は非常に高く評価されました。ここで

は、私が使用したものである:

SELECT 
    CAST('TRL' AS VARCHAR(3)) AS RECID, 
    COUNT(TotalRows) AS TOTREC 
FROM (SELECT DISTINCT 
    RTRIM(CAST(CASE 
      WHEN I2.VNDITNUM = '' 
      THEN 'BLANK' 
      ELSE I2.VNDITNUM END AS VARCHAR(20))) AS VNDITEM, 
    RTRIM(CAST(I.ITEMNMBR AS VARCHAR(20))) AS NUMITEM, 
    @@ROWCOUNT AS TotalRows, 
    I.ITMDESC 
    FROM Inv00101 I 
    JOIN Inv00102 I2 ON I2.ITEMNMBR = I.ITEMNMBR 
    JOIN ItemUnit I3 ON I3.ITEMNMBR = I.ITEMNMBR 
    LEFT OUTER JOIN prodmaster D ON D.itemid = I.ITEMNMBR 
    LEFT OUTER JOIN productinfo I4 ON I4.ITEMNMBR = I.ITEMNMBR 
    WHERE (ITMDESC LIKE '%ART%' OR ITMDESC LIKE '%CRAFT%') 
関連する問題