1

次のテーブルがあります。

Bradford_Score_Bands

BandNo    InclusiveScore
------------------------
1         0
2         150
3         500

Bradford_Scores

ClockNo     Dated        Score
--------------------------------
2           30/10/14     123
99          30/10/14     3
2           29/10/14     101
99          29/10/14     8

従業員

ClockNo
--------------------
2
3
99

私の目的は、スコアに基づいて、今日と昨日の各 ClockNo の BandNo を計算することです。

次のようなスコア値に基づいて、正しい BandNo を見つけることができます。

SELECT MIN(BandNo) FROM Bradford_Score_Bands WHERE InclusiveScore >= 123

次のように、各人の今日と昨日のスコアを見つけることができます。

SELECT DISTINCT EMP.ClockNo, 
ISNULL((SELECT Score FROM Bradford_Scores BFT WHERE Dated = '2014-10-30' AND BFT.ClockNo = EMP.ClockNo), 0) As ScoreToday,
ISNULL((SELECT Score FROM Bradford_Scores BFT WHERE Dated = '2014-10-29' AND BFT.ClockNo = EMP.ClockNo), 0) As ScoreYesterday
FROM Employees EMP

しかし、私は2つを組み合わせることができないようです。私はこのようなものがうまくいくと思った:

SELECT DISTINCT EMP.ClockNo, 
(SELECT MIN(BandNo) FROM Bradford_Score_Bands WHERE InclusiveScore >= 
(SELECT Score FROM Bradford_Scores BFT1 WHERE Dated = '2014-10-30' AND BFT1.ClockNo = EMP.ClockNo)),
(SELECT MIN(BandNo) FROM Bradford_Score_Bands WHERE InclusiveScore >= 
(SELECT Score FROM Bradford_Scores BFT2 WHERE Dated = '2014-10-29' AND BFT2.ClockNo = EMP.ClockNo))
FROM Employees EMP

しかし、BFTX.ClockNo = EMP.ClockNo を参照するサブクエリの部分が原因で、クエリが失敗しているようです。「Data Record ManagerCurrency not on a record」という役立つ広範囲エラーが表示されます

編集: SQL Server でこれとまったく同じクエリを試してみましたが、うまくいきました。これを書き直して、より Pervasive フレンドリーにする方法はありますか?

4

1 に答える 1

1

現在、これは SQL Server でタグ付けされています。機能するパーベイシブ クエリを作成する必要はないと感じています。

元のクエリを取得し、より簡単な方法で書き直しました。これを試して、問題が解決するかどうかを確認してください。

DECLARE @Bradford_Score_Bands TABLE (BandNo INT, InclusiveScore INT);
INSERT INTO @Bradford_Score_Bands VALUES (1, 0);
INSERT INTO @Bradford_Score_Bands VALUES (2, 150);
INSERT INTO @Bradford_Score_Bands VALUES (3, 500);
DECLARE @Bradford_Scores TABLE (ClockNo INT, Dated DATE, Score INT);
INSERT INTO @Bradford_Scores VALUES (2, '20141030', 123);
INSERT INTO @Bradford_Scores VALUES (99, '20141030', 3);
INSERT INTO @Bradford_Scores VALUES (2, '20141029', 101);
INSERT INTO @Bradford_Scores VALUES (99, '20141029', 8);
DECLARE @Employees TABLE (ClockNo INT);
INSERT INTO @Employees VALUES (2);
INSERT INTO @Employees VALUES (3);
INSERT INTO @Employees VALUES (99);

--Original Query
SELECT DISTINCT
    EMP.ClockNo, 
    (SELECT MIN(BandNo) FROM @Bradford_Score_Bands WHERE InclusiveScore >= (SELECT Score FROM @Bradford_Scores BFT1 WHERE Dated = '2014-10-30' AND BFT1.ClockNo = EMP.ClockNo)),
    (SELECT MIN(BandNo) FROM @Bradford_Score_Bands WHERE InclusiveScore >= (SELECT Score FROM @Bradford_Scores BFT2 WHERE Dated = '2014-10-29' AND BFT2.ClockNo = EMP.ClockNo))
FROM 
    @Employees EMP;

--New query
SELECT  
    e.ClockNo,
    MIN(bsbt.BandNo),
    MIN(bsby.BandNo)
FROM 
    @Employees e
    LEFT JOIN @Bradford_Scores bst ON bst.ClockNo = e.ClockNo AND bst.Dated = '20141030'
    LEFT JOIN @Bradford_Scores bsy ON bsy.ClockNo = e.ClockNo AND bsy.Dated = '20141029'
    LEFT JOIN @Bradford_Score_Bands bsbt ON bsbt.InclusiveScore >= bst.Score
    LEFT JOIN @Bradford_Score_Bands bsby ON bsby.InclusiveScore >= bsy.Score
GROUP BY
    e.ClockNo;

これを SQL Server で実行すると、両方のクエリでまったく同じ結果が得られました。

于 2014-10-31T16:03:22.690 に答える