2017-04-21 7 views
0

タイトルが混乱する可能性があります。2つのテーブルを結合しますが、各ユニークレコードの最初のインスタンスの最初のテーブルのデータのみを含めます。

私はケースのテーブルを持っており、各ケースには多くのタスクが含まれています。各タスクの別のワークフローを実現するために、私はCase_Emails、Case_Calls、Case_Chatsなどの異なるテーブルを持っています。

最終的にExcelにエクスポートされるクエリを作成します。この問合せでは、各タスクをリストしたいと思います。タスクは、共通の形式を使用して別の表のUNIONを介してすでに結合されています。クエリの各タスクでは、ケースに関連付けられた最初のタスクのみで、ケーステーブルの詳細を含める必要があります。以下の例:私の独創的なアプローチは、LEFTをしようとしていた

+----+---------+------------+-------------+-------------+-------------+ 
| id | Case ID | Agent Name | Task Info 1 | Task Info 2 | Task Info 3 | 
+----+---------+------------+-------------+-------------+-------------+ 
| 1 | 4000000 | Some Name | Detailstuff | Stuffdetail | Thingsyo | 
| 2 |   |   | Detailstuff | Stuffdetail | Thingsyo | 
| 3 |   |   | Detailstuff | Stuffdetail | Thingsyo | 
| 4 | 4000003 | Some Name | Detailstuff | Stuffdetail | Thingsyo | 
| 5 |   |   | Detailstuff | Stuffdetail | Thingsyo | 
| 6 | 4000006 | Some Name | Detailstuff | Stuffdetail | Thingsyo | 
+----+---------+------------+-------------+-------------+-------------+ 

ケースIDに登録しようが、私は、余分な行からデータをフィルタリングする方法を見つけ出すことができませんでした。

+1

私はExcelのピボットテーブルでこれを行うべきだと思います。 –

+0

残念ながら、私たちはすでに制約のためピボットテーブルを除外しています。 CSV形式で保存することはできず、使用されている他のツールでは機能しません。 – Thebluefish

+0

組合のクエリをお願いします。他のテーブルがどのように統合されるかははっきりしていません。 *タスク情報#*は異なるテーブルの列ですか? * email *、* calls *、* chats *のインジケータはどこですか? – Parfait

答えて

0

FROM Case_Calls Calls 

この他の名前で、私は、サブクエリに基づいてフィルタリングすることができました:

IIF(Calls.[ID] <> (select top 1 [ID] from Case_Calls where [Case ID] = Calls.[Case ID]), '', Cases.[Creator]) As [Case Creator] 

このソリューション私には私が望む結果が得られます:)それはむしろ醜いSQLであり、数十の列を扱っているときに解析するのは難しいですが、仕事は終わりです!アクセスがROW_NUMBER機能をサポートしている場合

よりよい解決策があるかどうか、私はまだ興味が...

+0

ここに完全なSQLと最初の投稿を入れてください。スニペットは役に立ちません。今、私たちは、どのテーブルに含まれているかを知らずに盲目に走っています。私たちがあなたを助けてください! – Parfait

0

あなたが参加したときに何があっても、重複した値を持つことになります。フィルターの後に選択したグループまたはグループの中のDistinctに入れられた重複を削除します。これにより、タスク情報1,2,3の照会で重複が解決されます。私はそうのようなクエリで私のテーブルに名前を付けることができることが分かった

1

これは、はるかに簡単になります。そうではありませんが、Tasksテーブルを使用して相関サブクエリをシミュレートすることができます(これは、各タスクに固有の数値IDがあることを前提としています)。これは基本的に、各タスクにCaseIDで区切られた行番号を割り当てます。次に、ケースIDとエージェント名を条件付きで表示することができます。RowNum = 1

SELECT Switch(RowNum = 1, CaseID) as Case, 
Switch(RowNum = 1, AgentName) as Agent, 
TaskName 
FROM (
    SELECT c.CaseID, 
    c.AgentName, 
    t.TaskName, 
    (select count(*) 
    from Tasks t2 
    where t2.CaseID = c.CaseID and t2.ID <= t.ID) as RowNum 
    FROM Cases c 
    INNER JOIN Tasks t ON c.CaseID = t.CaseID 
    order by c.CaseID, t.TaskName 
) 

あなたのテーブル構造を投稿していなかったので、私は、これは、あるとして、あなたのために動作しますわからないんだけど、多分あなたはそれを適応させることができます。

+0

タスクテーブルはUNIONの3つのテーブルであるため、タスクIDは一意ではないと思います。私はIDに何かを付け加えて独特のものにすることができるかもしれないが...私はこれを撃つだろう! – Thebluefish

+0

IDに何かを追加すると動作する可能性があります。また、上記の手法を使用して、各タスクに一意の行番号を付けることもできます。どちらの方法でも、UNIONのタスクをクエリーとして保存して、物事をきちんと保つのに役立ちます。 – Jerrad

関連する問題