2011-12-09 7 views
2

私は、SQL Serverで正常に動作する既存のSQLクエリを持っています。これはMySQLで動作させたいものです。私はそれを少しきれいにして、カラム/テーブル名などのバックティックを手がかりにしていましたが、動作させることはできません。ここでmySQLのネストされたselect文

は、問題の文です:

SELECT `EmployeeID` 
FROM `Employee` 
WHERE 
(
    (
     SELECT COUNT(*) AS A 
     FROM `TimeClock` 
     WHERE (`EmployeeID` = `Employee.EmployeeID`) 
     AND (`InOut` = 'True') 
    ) > (
     SELECT COUNT(*) AS B 
     FROM `TimeClock` AS `TimeClock_1` 
     WHERE (`EmployeeID` = `Employee.EmployeeID`) 
     AND (`InOut` = 'False') 
    ) 
) 

これはTimeClock表にInOut = FalseよりInOut = True多くを持っている任意のEmployeeID年代を返す必要があります。

ありがとうございました。

+1

あなたはどうしていますか? – Zohaib

+0

エラー: '不明な列 'Employee.EmployeeID' in 'where clause'' – Fuginator

答えて

1

これは偽

SELECT e.EmployeeId 
FROM Employee AS e 
INNER JOIN 
(
    SELECT tc.EmployeeID 
     , SUM(CASE 
       WHEN tc.InOut = 1 THEN 1 ELSE 0 
      END) AS InOutTrue 
     , SUM(CASE 
       WHEN tc.InOut = 0 THEN 1 ELSE 0 
      END) AS InOutFalse 
    FROM TimeClock AS tc 
    GROUP BY tc.EmployeeId 
) AS t ON e.EmployeeId = t.EmployeeId 
WHERE t.InOutTrue > t.InOutFalse 

より真InOutの複数の値が、私は私の非常に小さいインデックスなし試験データにショー同様の性能を思い付いた二つの選択肢があるEmployeeId値を提供しなければなりません。

これはほとんど同じですが、InOutFalseの代わりに合計レコード数を使用しています。

SELECT e.EmployeeId 
FROM Employee AS e 
INNER JOIN 
(
    SELECT tc.EmployeeID 
     , COUNT(1) AS RecordCount 
     , SUM(CASE 
       WHEN tc.InOut = 1 THEN 1 ELSE 0 
      END) AS InOutTrue 
    FROM TimeClock AS tc 
    GROUP BY tc.EmployeeId 
) AS t ON e.EmployeeId = t.EmployeeId 
WHERE t.InOutTrue > RecordCount - t.InOutTrue 

私は、MySQLが、私がここで使用CASTが必要になりますかどうかわからないけど、SQL Serverがなかったです。 (これは私がこれらをテストしたものです)BITカラムでSUMを実行できませんでした。

SELECT e.EmployeeId 
FROM Employee AS e 
INNER JOIN TimeClock AS tc ON e.EmployeeId = tc.EmployeeId 
GROUP BY e.EmployeeId 
HAVING SUM(CAST(tc.InOut AS INT)) > (COUNT(1) - SUM(CAST(tc.InOut AS INT))) 

3人とも同様に機能する場合は、個人的な好みになります。

+0

Humm、私はEmployeeID 1がもっと偽より真実であることを知っているテーブルにゼロ行を返します...(サンプルデータは10、 False) – Fuginator

+0

上記のコードを内側のselectだけに減らし、実行すると、Bock InOutTrueとInOutFalseのためにemployeeidの値が返されます... – Fuginator

+0

@Fuginator InOutのデータ型は?それは実際に文字列かブールですか?また、InOutの値に 'True'や' False'以外の値がありますか? –

関連する問題