2017-10-11 5 views
0

私は自分自身を教えようとしていて、自分にとって教えようと努力していますが、私にとっては非常に単純なクエリか、共通のもの。私は、私が達成しようとしていることを記述するためのレキシコンを知っているかどうかも分からないので、このスレッドのタイトルが間違っていることが判明したら謝罪します! :)同じクエリで異なる結果の組み合わせに対して同じ列を使用してデータを返す

私は大きなデータベースを持っています。私は、1つの列に2つの結果が一緒に現れる行、または同じ列にある別の2つの結果が一定の期間にわたって一緒に現れる行を識別したい。

私はANDを使用し始めましたが、結果はゼロでした。私は最後の2〜3時間を網の上で何度も成功させて過ごしました。 UNIONSELECT DISTINCTJOINやその他の解決策を提案する類似のスレッドがたくさんあるように見えますが、私のニーズに完全に対応できませんでした。

大変ありがとうございます。だから、私のテーブルはVNH.dbo.ClinicalCaseItem

データテーブルと呼ばれる

は次のようになります。

ActualDateTime | CaseId | ProcedureTestId | Description | FeeAmount 

が、私は何千人もの数百に実行されるよりも大きい2017-04-03ActualDateTimeまたはエントリの数を制限する必要があります。 ProcedureTestIdがキー列です。私は排他的にProcedureTestId 245と一緒に発生するCaseIdと、ProcedureTestId 326と一緒に発生するCaseIdProcedureTestId 309を特定する必要があります。

私が試したすべての異なった質問は、半ダースほどありませんし、私が必要とする結果を達成するのに近づいていないし、ほとんどが完全に失敗したためです。事前に

感謝

例のデータ:

ActualDateTime | CaseId | ProcedureTestId | Description  | FeeAmount 
    2017-04-25 | 123456 | 309    | Place iv catheter | 30.00 
    2017-04-25 | 123456 | 329    | GA Patient  | 100.00 
    2017-04-27 | 134523 | 309    | Place iv catheter | 30.00 
    2017-04-27 | 234567 | 245    | Sedate Patient | 45.00 
    2017-04-28 | 234567 | 309    | Place iv catheter | 30.00 
    2017-04-28 | 345321 | 245    | Sedate Patient | 45.00 
    2017-04-29 | 451324 | 309    | Place iv catheter | 30.00 
    2017-04-30 | 451324 | 309    | Place iv catheter | 30.00 
    2017-04-30 | 451324 | 375    | Surgical Pack  | 28.00 
    2017-04-25 | 989898 | 309    | Place iv catheter | 30.00 
    2017-04-27 | 989898 | 245    | Sedate Patient | 45.00 
    2017-04-25 | 999999 | 309    | Place iv catheter | 30.00 
    2017-04-27 | 999999 | 245    | Sedate Patient | 45.00 
    2017-04-27 | 999999 | 326    | Bathe Patient  | 45.00 
    2017-04-27 | 987654 | 375    | Surgical Pack  | 28.00 
    2017-04-25 | 987654 | 309    | Place iv catheter | 30.00 
    2017-04-27 | 987654 | 245    | Sedate Patient | 45.00 
    2017-04-27 | 987654 | 329    | GA Patient  | 100.00 
    2017-04-27 | 987654 | 326    | Bathe Patient  | 45.00 

は、クエリの期待される結果は次のようになります。

ActualDateTime | CaseId | ProcedureTestId | Description  | FeeAmount | count_of 
    2017-04-25 | 123456 | 309    | Place iv catheter | 30.00  | 2 
    2017-04-25 | 123456 | 329    | GA Patient  | 100.00 | 2 
    2017-04-27 | 234567 | 245    | Sedate Patient | 45.00  | 2 
    2017-04-28 | 234567 | 309    | Place iv catheter | 30.00  | 2 
    2017-04-25 | 989898 | 309    | Place iv catheter | 30.00  | 2 
    2017-04-27 | 989898 | 245    | Sedate Patient | 45.00  | 2 
    2017-04-25 | 999999 | 309    | Place iv catheter | 30.00  | 2 
    2017-04-27 | 999999 | 245    | Sedate Patient | 45.00  | 2 
    2017-04-25 | 987654 | 309    | Place iv catheter | 30.00  | 3 
    2017-04-27 | 987654 | 245    | Sedate Patient | 45.00  | 3 
    2017-04-27 | 987654 | 329    | GA Patient  | 100.00 | 3 
+0

実際のデータサンプルが役立つだろう。質問:「キー列」とはどういう意味ですか?それはプライマリキーか外部キーですか? – Alex

+0

申し訳ありませんが、ちょうど意味する - 最も重要な - 私の質問にヒンジがあるように。 例データ: – be4con

+0

サンプルデータと取得したい出力をお願いします。 – Alex

答えて

1

有するサンプルデータは、非常に便利ですが、それが結合されていない限り、 「期待された結果」に照会出力を比較することはできません。したがって私たちは働くかもしれない何かを発明することができます - それは私が下に示すものです。

あなたの言葉の解釈は、少なくともケース(309と245)または(309と326)を経たケースでcaseidが必要であるということです。この要件をサンプルデータと比較すると、その基準を満たす行が見つからないため、いくつか追加しました。しかし、ロジックでは、プロシージャ(245と326ではなく309)が返されるケースを採用していることにも注意してください。

SUM()関数内でcase式を使用し、having句(集計値に基づいて結果をフィルタリングできる)を使用して評価します。

このSQL Fiddleあなた自身の試用クエリを実行しましょう。

MS SQL Serverの2014スキーマのセットアップ

CREATE TABLE Table1 
    ([ActualDateTime] datetime, [CaseId] int, [ProcedureTestId] int, [Description] varchar(17), [FeeAmount] int) 
; 

INSERT INTO Table1 
    ([ActualDateTime], [CaseId], [ProcedureTestId], [Description], [FeeAmount]) 
VALUES 
    ('2017-04-25 00:00:00', 989898, 309, 'Place iv catheter', 30.00), 
    ('2017-04-27 00:00:00', 989898, 245, 'Sedate Patient', 45.00), 

    ('2017-04-25 00:00:00', 999999, 309, 'Place iv catheter', 30.00), 
    ('2017-04-27 00:00:00', 999999, 245, 'Sedate Patient', 45.00), 
    ('2017-04-27 00:00:00', 999999, 326, 'whatever 326 is', 45.00), 

    ('2017-04-25 00:00:00', 123456, 309, 'Place iv catheter', 30.00), 
    ('2017-04-25 00:00:00', 123456, 329, 'GA Patient', 100.00), 
    ('2017-04-27 00:00:00', 134523, 309, 'Place iv catheter', 30.00), 
    ('2017-04-27 00:00:00', 234567, 245, 'Sedate Patient', 45.00), 
    ('2017-04-28 00:00:00', 234567, 309, 'Place iv catheter', 30.00), 
    ('2017-04-28 00:00:00', 345321, 245, 'Sedate Patient', 45.00), 
    ('2017-04-29 00:00:00', 451324, 309, 'Place iv catheter', 30.00), 
    ('2017-04-30 00:00:00', 451324, 309, 'Place iv catheter', 30.00), 
    ('2017-04-30 00:00:00', 451324, 375, 'Surgical Pack', 28.00) 
; 

クエリ1

 select CaseId 
     , sum(case when ProcedureTestId in (309,245,326) then 1 else 0 end) count_of 
     from Table1 
     group by CaseId 
     having sum(case when ProcedureTestId in (309,245,326) then 1 else 0 end) > 1 

Results

| CaseId | count_of | 
|--------|----------| 
| 234567 |  2 | 
| 451324 |  2 | 
| 989898 |  2 | 
| 999999 |  3 | 

クエリ2

select 
     t.*, d.count_of 
from Table1 t 
inner join (
     select CaseId 
     , sum(case when ProcedureTestId in (309,245,326) then 1 else 0 end) count_of 
     from Table1 
     group by CaseId 
     having sum(case when ProcedureTestId in (309,245,326) then 1 else 0 end) > 1 
    ) d on t.CaseId = d.CaseId 
order by caseid, ProcedureTestId 

Results

|  ActualDateTime | CaseId | ProcedureTestId |  Description | FeeAmount | count_of | 
|----------------------|--------|-----------------|-------------------|-----------|----------| 
| 2017-04-27T00:00:00Z | 234567 |    245 | Sedate Patient |  45 |  2 | 
| 2017-04-28T00:00:00Z | 234567 |    309 | Place iv catheter |  30 |  2 | 
| 2017-04-29T00:00:00Z | 451324 |    309 | Place iv catheter |  30 |  2 | 
| 2017-04-30T00:00:00Z | 451324 |    309 | Place iv catheter |  30 |  2 | 
| 2017-04-30T00:00:00Z | 451324 |    375 |  Surgical Pack |  28 |  2 | 
| 2017-04-27T00:00:00Z | 989898 |    245 | Sedate Patient |  45 |  2 | 
| 2017-04-25T00:00:00Z | 989898 |    309 | Place iv catheter |  30 |  2 | 
| 2017-04-27T00:00:00Z | 999999 |    245 | Sedate Patient |  45 |  3 | 
| 2017-04-25T00:00:00Z | 999999 |    309 | Place iv catheter |  30 |  3 | 
| 2017-04-27T00:00:00Z | 999999 |    326 | whatever 326 is |  45 |  3 | 
+0

「期待結果」の重要性に注目してください(例:サマリーや詳細レイアウトが必要ですか?)また、サンプルデータは「期待結果」のデータも提供する必要があります。 –

+0

ありがとうございます。興味深いことに、私が提供したサンプルデータには一致する行がありましたが、あなたの解釈は正しいものでした。クエリ2の結果は、ほとんど私が探しているものです。私はCaseTdId 309を除いたCaseIdとCaseId 451324と999999の最下位行を除いて、309,326または245を除いたProcedureTestIdを除外します。私はあなたの拡張データテーブルを含めるために私の投稿を編集し、結果テーブルを追加します。 – be4con

関連する問題