0

私は問題があります。

昨夜の午後 10 時から深夜 0 時までの間に人が建物に入ったかどうかを確認するために BIT 値を取得しようとしています。サブクエリ コードを単独で実行すると、必要な結果が得られます。SSRS2008 を使用しているため、すべての結果が同じストアド プロシージャにある必要があります。

問題は、ビット値がある程度正しいことです。明らかに偽である場合は偽になり、明らかに真である場合は真になります。しかし、中間の人 (23 時に退社する日勤) の場合、結果は多少ランダムになります。

誰も手がかりを持っていますか?

SELECT DISTINCT TOP 200 
   Events.LoggedTime, 
   PTUsers.Name, 
   PTDoors.PTDoorsID, 
   PTUsers.AccessLevel, 
   CAST(CASE 
           WHEN EXISTS (SELECT Events.LoggedTime 
                        FROM Events 
                        INNER JOIN PTUsers AS PTUsers_1 ON Events.GlobalIndex1 = PTUsers.GlobalRecord 
                        INNER JOIN PTDoors AS PTDoors_1 ON Events.RecordIndex2 + 1 = PTDoors.Address
                        WHERE (DATEPART(day, Events.LoggedTime) = DATEPART(day, GETDATE() - 1)) 
                          AND (DATEPART(hour, Events.LoggedTime) IN (22, 23)) 
                          AND (PTDoors_1.PTDoorsID = 14)) THEN 1 ELSE 0 END AS BIT) AS Night
FROM         
    Events 
INNER JOIN
    PTUsers ON Events.GlobalIndex1 = PTUsers.GlobalRecord 
INNER JOIN
    PTDoors ON Events.RecordIndex2 + 1 = PTDoors.Address
WHERE     
    (PTUsers.Panel = 0) 
    AND (PTDoors.Panel = 0) 
    AND (PTDoors.PTDoorsID = 14) 
    AND (DATEPART(day, Events.LoggedTime) = DATEPART(day, GETDATE()) - 1) 
    AND (PTUsers.AccessLevel IN (3))
ORDER BY 
    Events.LoggedTime DESC
4

2 に答える 2

0

@lrd私はあなたが提案した修正を行いました。テーブルのエイリアスを指摘してくれてありがとう:)

キャストを削除したので、BIT 列を取得しました。しかし、今の問題は、結果としてすべて「1」を取得することです。私を困惑させているのは、サブクエリがそれ自体でクエリとして機能することです。1 日さかのぼって、指定された時間枠でそのドアのエントリを表示します。

今、私は同じ人の情報を比較しようとしています。つまり、リストにある人が昨日の午前 6 時に到着しているのを見て、その人がその前日の 22 時から午前 0 時の間に到着したかどうかを確認し、表示するビット値を返します。それ。

SELECT DISTINCT TOP 200 Events.LoggedTime, PTUsers.Name, PTDoors.PTDoorsID, PTUsers.AccessLevel, CASE WHEN EXISTS
                          (SELECT     Events.LoggedTime
                            FROM          Events INNER JOIN
                                                   PTUsers AS PTUsers_1 ON Events.GlobalIndex1 = PTUsers_1.GlobalRecord INNER JOIN
                                                   PTDoors AS PTDoors_1 ON Events.RecordIndex2 + 1 = PTDoors_1.Address
                            WHERE      (DATEPART(day, Events.LoggedTime) = DATEPART(day, GETDATE() - 1)) AND (DATEPART(hour, Events.LoggedTime) IN (22, 23)) AND 
                                                   (PTDoors_1.PTDoorsID = 14)) THEN 1 ELSE 0 END AS BIT
FROM         Events INNER JOIN
                      PTUsers ON Events.GlobalIndex1 = PTUsers.GlobalRecord INNER JOIN
                      PTDoors ON Events.RecordIndex2 + 1 = PTDoors.Address
WHERE     (PTUsers.Panel = 0) AND (PTDoors.Panel = 0) AND (PTDoors.PTDoorsID = 14) AND (DATEPART(day, Events.LoggedTime) = DATEPART(day, GETDATE()) 
                      - 1) AND (PTUsers.AccessLevel IN (3))
ORDER BY Events.LoggedTime DESC
于 2014-10-10T10:43:01.823 に答える
0

結果を EXISTS() に設定することで、Night を BIT として明示的に定義しているため、CAST は必要ないと思います。間違っていたクエリを削除しました。

私はあなたの問題を見ます。サブクエリの結合制約に正しいテーブル エイリアスを使用していません。

そのはず:

INNER JOIN PTUsers AS PTUsers_1 ON Events.GlobalIndex1 = PTUsers_1.GlobalRecord 
INNER JOIN PTDoors AS PTDoors_1 ON Events.RecordIndex2 + 1 = PTDoors_1.Address

また、結合で正しい値を使用していることを確認してください。テスト用に以下を変更します。

FROM Events Events_2
INNER JOIN PTUsers AS PTUsers_1 ON Events_2.GlobalIndex1 = PTUsers_1.GlobalRecord 
INNER JOIN PTDoors AS PTDoors_1 ON Events_2.RecordIndex2 + 1 = PTDoors_1.Address
于 2014-10-09T17:02:18.393 に答える