2011-12-13 8 views
0

私は各店舗で平均よりも週に一時間働いている労働者のリストを取得したいと思います。複雑なSQL ServerのSELECTクエリ

労働者:

  • 時間(時間のAMOUT労働者が週に動作します)
  • ショップ(労働者がで働く店)

これは私を与えますペアのリスト(ショップ、ショップの平均時間):

SELECT shop, AVG(hours) AS 'av' FROM Workers GROUP BY shop 

これが私の '擬似SQL' です:

SELECT 
    name, hours, 
    (SELECT shop, AVG(hours) AS 'av' FROM Workers GROUP BY shop).av 
FROM Workers 
WHERE 
    (SELECT shop, AVG(hours) AS 'av' FROM Workers GROUP BY shop).av > Workers.hours 
    AND (SELECT shop, AVG(hours) AS 'av' FROM Workers GROUP BY shop).shop = Workers.shop 

私は、これは単一のT-SQLクエリで実行する必要があります。手伝って頂けますか?

+0

テーブルスキーマの説明はありますか?ちょうどこれで手伝ってくれるのは難しいです。 – Shlomo

答えて

2

あなたはかなり近いです。 (?「Pracownicy」テーブル何)私はあなたのクエリを完全に理解していないが、これは(未テストクエリ)あなたのアイデアを与える必要があります。で、テーブルとしてクエリを使用して:

SELECT w.name, 
     w.hours, 
     w.shop, 
     avg.average 
    FROM Workers AS w, 
     (SELECT shop, 
       AVG(hours) AS average 
      FROM Workers 
     GROUP BY shop) AS avg 
WHERE w.shop = avg.shop 
    AND w.hours < avg.average 

注トリックこちらFROM句。これにより、反復的な副選択の数を減らすことができます。

+0

申し訳ありません 'Pracownicy'私はそれを '労働者'に翻訳するのを忘れました。今修正されました。 – gisek

3

あなたはCommon Table Expressionsを使用することができます。

With averageHours as (SELECT shop, AVG(hours) AS 'av' FROM Workers GROUP BY shop) 
SELECT name, hours, averageHours.av 
FROM Workers WHERE averageHours.av > Workers.hours 
      AND averageHours.shop = Workers.shop 
-1

SELECT NAME FROM TABLE T1 WHERE T1.HOUR < (SELECT AVG(HOUR) FROM TABLE GROUP BY T1.NAME)

これは、任意の混乱wihtoutに働くだろう最も最も簡単なクエリです。

+0

あなたは、各ワーカーが自分の店の平均と比較される条件を処理していません。 –