"Revised"と "Projected"の2つのテーブルからなる単純なSQLクエリ(Oracle)を実行しようとしています。 「改訂された」テーブルからレコードを引き出すことができます。修正されたテーブルが空白の場合は、「投影済み」テーブルから取得する必要があります。私が試みてきたさまざまな結合の組み合わせは、私が探しているデータを返さない。どんな助けもありがとう!SQL 2つのテーブルは、それぞれのデータに応じてプルする必要があります
ありがとうございました。
"Revised"と "Projected"の2つのテーブルからなる単純なSQLクエリ(Oracle)を実行しようとしています。 「改訂された」テーブルからレコードを引き出すことができます。修正されたテーブルが空白の場合は、「投影済み」テーブルから取得する必要があります。私が試みてきたさまざまな結合の組み合わせは、私が探しているデータを返さない。どんな助けもありがとう!SQL 2つのテーブルは、それぞれのデータに応じてプルする必要があります
ありがとうございました。
あなたはこれを試しましたか?
select your columns
from revised
union all
select your columns
from projected where not exists (select 1 from revised);
修正されたものからすべてを選択し、改訂されたものがない場合は、すべてから選択します。
あるいは、exists
なし:
select your columns
from revised
union all
select your columns
from projected where (select count(*) from revised) = 0;
編集:ちょうどプロジェクトごとにフィルタリングし、プロジェクトレベルであなたの条件を得るために:
select your columns
from revised
union all
select your columns
from projected p where (select count(*)
from revised r
where r.Revised_ProjectID = p.Projected_ProjectID) = 0;
フロリン、お返事ありがとうございます。このクエリは、Revisedテーブルからレコードを取り出すだけです。 Revisedテーブルが空白の場合、Projectedから何も取得されていません。これは、クエリを実行するために探しているものです。 – bmhitchins91
これはあなたの望むものではありません。 '改訂からのカウント(*)の選択 'を返すのは何ですか? –
また、非常に重要:私の応答/クエリを理解しましたか? –
あなたはケースを使用することができ、左が達成するために参加この。
select p.Project_ID,
case when r.Project_ID is null then p.ProjectedPaymentAmount else r.RevisedPaymentAmount end as PaymentAmount,
case when r.Project_ID is null then p.ProjectedPaymentDate else r.RevisedPaymentDate end as PaymentDate
from ProjectPayments_Projected p
left join ProjectPayments_Revised r on p.Project_ID = r.Project_ID
プロジェクトに複数のリビジョンがある場合は、これを使用します。
;WITH cte AS
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY Project_ID ORDER BY RevisedPaymentDate DESC) AS rn
FROM ProjectPayments_Revised
)
select p.Project_ID,
case when r.Project_ID is null then p.ProjectedPaymentAmount else r.RevisedPaymentAmount end as PaymentAmount,
case when r.Project_ID is null then p.ProjectedPaymentDate else r.RevisedPaymentDate end as PaymentDate
from ProjectPayments_Projected p
left join cte r on r.rn = 1 and r.Project_ID = p.Project_ID
列には、Revised_ProjectID、Revised_Amt、Revised_Date、およびProjected_Aject、Projected_ProjectIDが含まれます。私はあなたのSQLを試みるときに "ISとNULLの近くで不正な構文"を取得しています。 – bmhitchins91
構文を修正しました。 'case when' – fqhv
これは必要以上のデータを返します。 R.ID、R.Amt、R.Date&P.ID、P.Amt、P.Date各テーブルに3つの列があります。Revisedテーブルの有無に基づいて正しい3列を返すクエリが必要ですそれに含まれるすべてのデータ。改訂表にデータがある場合は、そのデータをプルします。そうでない場合は、「投影データ」を引き出します。両方にデータがある場合は、Revisedを引く。 – bmhitchins91
これを試してください。奇妙に見える。通常動作します。
select id, max(amt) amt, max(date) date
from (select p.id id, p.amt amt, p.date date
from projected p
union
select r.id, r.amt, r.date
from revised)
group by id;
Selectステートメントのフィールドはどのテーブルから取得する必要がありますか? – bmhitchins91
インラインビュー。投影 結合から –
SELECT ID、MAX(AMT)AMT、MAX(DATE)DATE P.AMOUNT、P.PROJECT_IDを選択( FROM、PDATE SELECT R.PROJECT_ID、R.AMT、R。 DATE FROM REVISED) GROUP BY ID;私は「GROUP」の近くで誤った構文を取得していますか? – bmhitchins91
のでRevised
、レコード、Projected
レコードまたはプロジェクトIDの両方が常にあります。一つの方法は、テーブルを結合し、あなたが得るものを見るの外にされています
select
case when revised_projectid is not null then revised_projectid else projected_projectid end as project_id,
case when revised_projectid is not null then revised_amt else projected_amt end as project_amt,
case when revised_projectid is not null then revised_date else projected_date end as project_date
from revised r
full outer join projected p on p.projected_projectid = r.revised_projectid;
ちょうどそれの楽しみのために、ここで同じ結果を得るUNIONクエリです。私たちは2つのテーブルを結合し、途中で優先フラグを与えます。次に、project_idごとのレコードのランクを上げて、より良いレコードランク1を与えます。次に、他のレコードを破棄して完了します。あなたは、私はあなたに別のオプションを表示するために、私の答えに、この2番目のクエリを追加しました
select project_id, project_amt, project_date
from
(
select
project_id,
project_amt,
project_date,
row_number() over (partition by project_id order by priority) as rn
from
(
select
1 as priority,
revised_projectid as project_id,
revised_amt as project_amt,
revised_date as project_date
from revised
union all
select
2 as priority,
projected_projectid as project_id,
projected_amt as project_amt,
projected_date as project_date
from projected
)
)
where rn = 1;
:-)この問題を解決するための多くの方法がある参照してください。今度は1つのアプローチが良いかもしれませんが、次は同じような問題があるときはもう1つは正しい選択でしょう。
最初のクエリは私に正しいロジックを与えますが、同じ値の重複した行を返しています。それを修正する方法はありますか? 2番目のクエリは、私に "シンタックスエラーに近い"というメッセージを与えています。 – bmhitchins91
**最初のクエリ:**わかりました。私は、プロジェクトIDがテーブルに対して一意であると仮定しました。そうでなければ、もちろん重複しているかもしれません。結果からこれらを削除するには、 'SELECT DISTINCT'を使います。とにかく、異なる値を持つ1つのプロジェクトIDに対して複数の結果レコードを取得することは可能です。 ** 2番目のクエリ:**構文エラー(Oracle 11g)が表示されません。おそらく、あなたは非常に古いOracle版を持っていますか? –
作成したクエリとテーブルの構造を確認できますか?いずれかのテーブルに多数のフィールドがある場合は、関連するフィールドだけを表示することを検討してください。 –
列にはRevised_ProjectID、Revised_Amt、Revised_DateおよびProjected_Aject、Projected_Amt、Projected_ProjectIDが含まれます。私は以下の両方の提案を試みました。基本的に、改訂表にデータがある場合は、そのデータを使用し、改訂表が空白の場合は、表を使用します。両方のテーブルにデータがある場合、私は改訂版を引き出す必要があります。ありがとうございました。 – bmhitchins91