ここでは話があります:私は有害な液体化学物質を有用な化学物質にリサイクルする会社で働いています。このプロセスの一部は、リサイクルプロセスの各部分が完了したときに、これらの材料を1つのタンクから別のタンクに移動することを含む。これらのタンクは、私たちのタンクファーム、蒸留システムの一部、鉄道車両、またはタンカートラックのいずれかにあります。私が割り当てられたタスクは、マネージャが任意のタンクを持ち上げて、それが処分されるかまたは売り出されるまで各タンクを通してその材料の動きに従うことを可能にするクエリを書くことでした。私の時間の前に、データベースは約10年前に構築されていたので、データは私が処理しなければならないものです(つまり、作業を簡単にするために変更することはできません)。今再帰的なT-SQLクエリ日付とタンク名を使用
テーブル構造:この努力に自分自身を貸すの列は以下のとおりです。
- SouceTank
- OpenDate(日空のタンクは材料の受信を開始する)
- CosedDate(タンクがある日付
- DestinationTank(材料が移されたタンク)
- ProductName(私は動きを検証するためにこれを追加します。混合する。いくつかあります。アルゴリズムが正しく動作していないと、問題が発生する可能性があります。
すべてのタンクにはOpenDateがありますが、タンクがまだ満杯になっているか、出荷待ちのタンクには終了日がありません。ほとんどの場合、タンクは化学的に異論はありません。空のタンクはどんな化学物質にも使用できます。 1から10までの動きが期待できます。
再帰的なCTE T-SQLアルゴリズムを使用しましたが、SourceTankのCosedDateがDestinationTankのOpenDateとCosedDateの間にあった一致するDestinationTankにSourceTankを一致させようとしましたが、まだ閉じていなければ、DestinationTankのOpenDate。
サンプルデータ:
SourceTank StartDate ClosedDate DestinationTank ProductName
------------------------------------------------------------------------
TNK01-5 08/03/2017 08/10/2017 TNK30-6 Fuels
TNK01-5 08/07/2017 08/10/2017 TNK40-6 Fuels
TNK01-5 07/20/2017 07/31/2017 TNK01-5 Incin
TNK01-5 08/10/2017 08/17/2017 TNK30-6 Incin
TNK01-5 08/12/2017 08/17/2017 TNK30-6 Fuels
TNK03-5 08/13/2017 08/22/2017 TNK30-6 IBAC feed
TNK07-5 08/11/2017 08/17/2017 TNK40-6 Incin
TNK07-5 08/14/2017 08/29/2017 TNK40-6 Fuels
TNK07-5 07/15/2017 08/10/2017 TNK30-6 Picoline Cut
TNK07-5 08/03/2017 08/10/2017 TNK02-5 Pico 2nd Pass
TNK07-5 08/06/2017 08/17/2017 TNK40-6 Fuels
TNK08-5 08/05/2017 08/10/2017 TNK40-6 Fuels
TNK08-5 08/07/2017 08/08/2017 TNK30-6 Fuels
TNK08-5 08/10/2017 08/22/2017 TNK40-6 Water
TNK08-5 07/24/2017 08/10/2017 TNK02-5 Picoline Cut
TNK09-10 07/20/2017 NULL TNK30-6 Picoline Crude
TNK09-10 07/21/2017 08/04/2017 TNK30-6 Picoline Crude
TNK09-10 08/02/2017 08/10/2017 TNK30-6 Cyclo Waste
TNK09-10 08/05/2017 08/10/2017 TNK30-6 Cyclo Waste
TNK09-10 08/07/2017 08/10/2017 TNK30-6 Cyclo Waste
TNK09-10 08/04/2017 08/10/2017 TNK30-6 Cyclo Waste
TNK09-10 08/15/2017 08/22/2017 TNK30-6 IBAC feed
TNK09-10 08/11/2017 08/17/2017 TNK30-6 IBAC feed
TNK09-10 08/12/2017 08/17/2017 TNK30-6 IBAC feed
TNK30-6 08/08/2017 08/29/2017 TNK30-6 Cyclo Waste
TNK40-6 08/13/2017 08/22/2017 TNK30-6 IBAC:PRODUCT
TNK41-6 08/14/2017 09/27/2017 NATX25496 IBAC:PRODUCT
TNK51-12 07/26/2017 09/15/2017 TNK30-6 CYCLO Product
TNK62-12 07/28/2017 09/12/2017 TNK30-6 NON-RCRA NMP
TNK74-12 07/29/2017 NULL TNK30-6 Picoline Crude
TNK91-8 08/03/2017 08/22/2017 TNK08-5 Picoline Prod
ここに私が試したものです。私は私が期待した結果がどのように見えるか分からないとして、これはどのように便利になりますわからない
WITH TanksCTE AS (
SELECT [TrackingNum]
,[TblTankTracking].[TankID]
,[StartDate]
,[TblTankTracking].[ProductID]
,[ClosedDate]
,[Destination]
FROM [MAFTS].[Laboratory].[TblTankTracking]
UNION ALL
SELECT TCTE.[TrackingNum]
,TRACK.[TankID]
,TRACK.[StartDate]
,TRACK.[ProductID]
,TRACK.[ClosedDate]
,TRACK.[Destination]
FROM TanksCTE AS TCTE INNER JOIN
[MAFTS].[Laboratory].[TblTankTracking] TRACK
ON TCTE.[TankID] = TRACK.[Destination]
AND TRACK.[ClosedDate] BETWEEN TCTE.[StartDate] AND TCTE.[ClosedDate]
)
SELECT * FROM TanksCTE
option (maxrecursion 0)
入力パラメータがある場合は、それを私たちに教えてください。あなたはタンクベースでタンク上でこのクエリを行うつもりですか?)含まれていると便利かもしれないクエリが動作していない場合。 – pcdev
質問を改善するためのヒントについては、[こちら](http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/)をお読みください。適切なソフトウェア(MySQL、Oracle、DB2など)とバージョンの両方でデータベースの質問にタグを付けると便利です。 'sql-server-2014'です。構文と機能の相違は、しばしば答えに影響します。 'tsql'は選択肢を絞り込みますが、データベースは指定しないことに注意してください。 – HABO
正しい結果は何ですか?あらゆる種類のクエリを生成することができますが、提供されたデータの結果として期待していることがわかっているのが最善です。 *私たちが提案するクエリを検証することもできますので、あなたの仕事は少なくなります。* –