私は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 |
あなたはこれらのクエリから実際のファイルを作成していますか?または、結果セットのみ。 – HLGEM
@jderekc:あなたはあなた自身で質問に答えました。あなたはあなたの 'Detail'クエリで 'セカンダリID'を使っていますが、あなたは 'Trailer'クエリでそれを使っていません。 'セカンダリID'が 'Detail'クエリの選択基準の一部である場合、論理的には、同じカウントを得るために 'Trailer'クエリで'セカンダリID'が必要になります。 – abraxascarab
2つ目のこと: 'Trailer'クエリが常に1レコードしか返さない場合は、 'Detail'クエリの直後に '@@ rowcount'というtsql関数を使用できます。次に、実際の行数を 'Trailer'に配置するだけです。 'DECLARE @rc as integer;'のように整数変数を宣言する必要があります。次に、 'Detail'クエリの後にrowcountを割り当てます: 'set @rc = @@ rowcount;'次に、Trailerクエリであなたの行数が必要な場所で@rc変数を使用してください。 – abraxascarab