2017-06-20 8 views
0

を含むクエリにクロス集計クエリを作成することはできませんクロス集計からそれを実行するために、それは私にそれがテーブルを見つけることができないというエラーが求められます「」これは、私が「時刻表」をは、私はサブクエリが含まれているクエリを持っているサブクエリ

SELECT a.VesselID, a.MovementID, a.MovementTime, (SELECT TOP 1 
Timetable.MovementTime 
FROM Timetable 
WHERE (((Timetable.MovementID)="Arrival") AND 
((Timetable.VesselID)=a.VesselID]) AND ((Timetable.MovementTime)>a. 
[MovementTime])) 
ORDER BY Timetable.MovementTime) AS Arrival1, 
DateDiff('h',[a].[MovementTime],[Arrival1]) AS [Interval] 
FROM Timetable AS a INNER JOIN Timetable ON a.ID = Timetable.ID 
WHERE (((a.MovementID)="Departure")); 

を使用する別名である私は、このQuestionは非常に似ており、解決策はそのIだと思います@DHWは言ったが、私はそれをすることができなかった。作業クエリで
私はSELECT TOP 1を置くことができますが、分割して、私はそれをどこに置くか知らないしてみてください:

[Departure_Query] 
    SELECT Timetable.VesselID, Timetable.MovementTime AS mymov, 
    Timetable.MovementID 
    FROM Timetable 
    WHERE (((Timetable.MovementID)="Departure")); 

[Main] 
    SELECT Timetable.MovementTime, Timetable.MovementID, Timetable.VesselID, Departure_Query.mymov, DateDiff('h',[mymov],[MovementTime]) AS [Interval] 
    FROM Timetable INNER JOIN Departure_Query ON Timetable.VesselID = Departure_Query.VesselID 
    WHERE (((Timetable.MovementTime)>[Departure_Query].[mymov]) AND ((Timetable.MovementID)="Arrival") AND ((Timetable.VesselID)=[Departure_Query].[VesselID])) 
    ORDER BY Timetable.MovementTime; 

私は問題があると思う:

が、これは分裂の私の試みです。

更新実際には、今のところ私はそれを分割したいと思っています。なぜなら、私はその上にレポートを作成しようとしているからです。このフィールドでは、Access cantはグループ化されています。

しかし、いずれにせよ、この私の試み

TRANSFORM DateDiff('h',[a].[MovementTime],[Arrival1]) AS [Interval] 
SELECT a.MovementTime 
FROM Timetable AS a INNER JOIN Timetable ON a.ID = Timetable.ID 
WHERE (((a.MovementID)="Departure")) 
GROUP BY a.MovementID, a.MovementTime, (SELECT TOP 1 Timetable.MovementTime 
FROM Timetable 
WHERE (((Timetable.MovementID)="Arrival") AND ((Timetable.VesselID)=a.[VesselID]) AND ((Timetable.MovementTime)>a.[MovementTime])) 
ORDER BY Timetable.MovementTime) 
PIVOT a.VesselID; 

The resultsThe Design View

+0

CROSSTABを送信しようとしました。 ColumnHeaderはどのフィールドですか?可能な列はいくつありますか?これは静的か可変か静的であまりにも多くの要素がない場合、CROSSTABをエミュレートする方法があります。 http://www.datapigtechnologies.com/flashfiles/crosstab.html – June7

+0

1日あたりの各船舶の勤務時間が表示されるはずなので、動的だと思います。それで、それは間隔の長さとともに成長するでしょう。実際には、今のところ私はそれを分割したいと思っています。なぜなら、私はその上にレポートを作成しようとしているからです。このフィールドでは、Access cantはグループ化されています。 –

+0

CROSSTABの試行を追加しました –

答えて

0

は、サブクエリを置き換えるために、ドメイン集計、DMin()とのクロス集計を考えてみましょう:

TRANSFORM DateDiff('h', main.[MovementTime], main.[Arrival1]) AS [Interval] 
SELECT main.MovementID, main.MovementTime 
FROM 
    (SELECT t.VesselID, t.MovementID, t.MovementTime, 
      DMin("MovementTime", "Timetable", "MovementID = 'Arrival' 
       AND VesselID = " & t.VesselID & " 
       AND MovementTime > #" & t.MovementTime & "#") As Arrival1 
    FROM Timetable AS t 
    WHERE (((t.MovementID) = 'Departure')) 
    ) As 
GROUP BY main.MovementID, main.MovementTime 
PIVOT main.VesselID; 
+0

申し訳ありませんが、私は完全にあなたを理解するとは思わない。 SQL文を適用しようとしましたが、それを動作させることができませんでした。 あなたは 'Dmin()'で置き換えて詳しく教えてください。 別のこと:私の「分割ソリューション」の唯一の問題は、出発時刻より後のすべての値を比較することです。正しいことは次のとおりです。**最初の**到着時刻>出発時刻>それら 努力ありがとうございます –

+0

*しかし、それは働くことができなかった* ...何がうまくいかなかったのですか?間違いましたか? 'DMin()'は外部クエリのVesselIDに一致する 'SELECT TOP 1'と同等でなければなりません。これは、各行に対して1つのスカラーを返す相関クエリです。私はあなたの分割ソリューションを使用しなかったが、非常に最初のクエリを調整しました。 – Parfait

+0

私は質問のスクリーンショットを追加しました。親切にアルックを取る –

0

はあなた@ParfaitとJune7 @ありがとう、私はこの回答を追加しているので、将来誰でもこの問題から利益を得ることができます。

問題は
私がする問題を考え出し:クエリは、特定の船
容器1は、ディパーテッドすなわち6/1、6/3、6/6と到着のために、すべての小さな出発日を引いています6/2,6/2,6/8。最終日には、6/8-6/6、6/8-6/3,6/8-6/1を差し引いていました。コースの最初の1つ(太字のもの)が正しいものです。

ソリューション

SELECT Min(Timetable.MovementTime) AS MinOfMovementTime, Departure_Query.mymov AS DeptDate, Min(DateDiff('h',[mymov],[MovementTime])) AS WorkingH, Timetable.MovementID, Timetable.VesselID 
FROM Timetable LEFT JOIN Departure_Query ON Timetable.VesselID = Departure_Query.VesselID 
WHERE (((Timetable.MovementID)="Arrival") AND ((Timetable.VesselID)=[Departure_Query].[VesselID]) AND ((Timetable.MovementTime)>[mymov])) 
GROUP BY Departure_Query.mymov, Timetable.MovementID, Timetable.VesselID 
ORDER BY Min(Timetable.MovementTime); 

ここでの唯一の変更は、最大の出発日に変換小さい減算値を、与えたMin(DateDiff('h',[mymov],[MovementTime]))です。

関連する問題