2017-08-11 25 views
0

私はSQLの新しいユーザーです。私のコードでいくつかの助けをすることができます、助けてください!SQL Server複数のテーブル複数のフィルタ

Iは、2つのテーブルを持っている:表1(品目マスタ)及び表2(購入履歴)

  • 表1、表2は、すべての単一を有する
  • 等について、ベンダー、倉庫のような商品情報を持ちますトランザクション。

表1の例

ITEM  Warehouse Vendor 
------------------------------ 
ITEM-0001 ATLANTA  AMAZON 
ITEM-0002 ATLANTA  AMAZON 
ITEM-0003 ATLANTA  GOOGLE 
ITEM-0004 ATLANTA  AMAZON 

表2例

ITEM  Purchase Date Price  WAREHOUSE RECEIVE DATE 
---------------------------------------------------------------- 
ITEM-0001 01/01/2017 $5  ATLANTA  03/05/2017 
ITEM-0001 01/01/2017 $5.2  DENVER  02/03/2017 
ITEM-0001 01/02/2017 $5.4  L.A.  05/07/2017 
ITEM-0002 .... AND SO ON 

私は結合された結果セットがしたい - このような:

ITEM(T1) WAREHOUSE(T1) VENDOR(T1) Avg_Price(T2) LEADTIME 
------------------------------------------------------------------ 
ITEM-0001 ATLANTA  AMAZON  5.33333  65 DAYS 
ITEM-0002 ATLANTA  AMAZON ... so on 

をここに私のSQLコードです:

SELECT 
    A.ITEM, A.WAREHOUSE, A.VENDOR, B.PRICE, B.LEADTIME 
FROM 
    TABLE1 A, TABLE2 B 
WHERE 
    A.ITEM = B.ITEM 
    AND B.PRICE = (SELECT AVG(B.PRICE) 
        FROM TABLE2 B 
        WHERE A.ITEM = B.ITEM 
        GROUP BY B.ITEM) 

この部分は問題なく平均価格を追加します。今私が苦労しているのは、私がLEADTIMEを追加したいときです。それをどのようにコード化するのか?

LEADTIMEは、特定のベンダーおよび特定の倉庫のアイテムが到着する平均時間です。たとえば、item0001がベンダーxから倉庫yに6,8,10日後に到着した場合、リードタイムはそのベンダーとその倉庫のこれらの日の平均(8日間)になります。

助けてください!

事前

のおかげで編集:HERE HELPはMY NEW CODEされた後... THANKS!

SELECT B.ITEM, 
     A.VENDOR, 
     B.WAREHOUSE, 
     SUM(A.QUANTITY), 
     AVG(A.PRICE) AS AVGERAGE_PURCHASE PRICE, 
     AVG(A.RECEIVEDATE- A.PURCHASEDATE) AS LEADTIME, 
    FROM ITEMTABLE B 
    JOIN ITEMPURCHASETABLE A 
    ON (B.ITEM=A.ITEM AND B.WAREHOUE=A.WAREHOUSE) 
    WHERE A.PURCHASEDATE > 1170101 
    GROUP BY B.ITEM, B.WAREHOUSE, A.VENDOR 
    HAVING (MIN(A.PRICE)/MAX(A.PRICE)) !<0.1 AND COUNT(A.PRICE) >3 
    ORDER BY INVENTORY_COST DESC 

新しい質問:日付は1YYMMDDの形式ですか?

+2

[悪い習慣をキックする:古いスタイルを使用してJOINを](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old ANSI - ** 92 ** SQL標準(** 25年*)の*適切な* ANSI 'JOIN'構文で置き換えられた*スタイルのコンマで区切られたテーブル* *前)とその使用はお勧めしません –

+1

あなたはリードタイムを追加したいと私たちにこれを教えてくださいしかしあなたはリードタイムが何であるか教えてください。リードタイムとは何ですか? – Hogan

答えて

2

あなたのコードは正しくありません。あなたはBに参加しますが、サブクエリの値はどこにあるのですか。 =ここではBの値をフィルタリングしないで値を設定します。

@marc_sは25年前の構文を使用せずにこのSQLを書き込む方法を示しています。

SELECT A.ITEM, A.WAREHOUSE, A.VENDOR, 
     AVG(B.PRICE) AS AVG_PRICE 
     --, B.LEADTIME not sure this works don't know requirements. 
FROM TABLE1 A 
JOIN TABLE2 B ON A.ITEM = B.ITEM 
GROUP BY A.ITEM, A.WAREHOUSE, A.VENDOR 

はまた、以下のMicrosoft SQL Serverで同様の結果を得るために、クエリでウィンドウ関数(あなたが気にしている場合、以前のバージョンを参照してください。)

+0

ありがとう!私は新しいコードを投稿し、それは機能的です。日付は1yymmddと書式設定されていますが、修正する方法はありますか? – MrKen

1

でこれを行うことができます。

SELECT A.ITEM 
, A.WAREHOUSE 
, A.VENDOR 
, AVG(B.PRICE) 
, AVG(DATEDIFF(day,B.PurchaseDate,B.ReceiveDate)) AS LeadTime 
FROM TABLE1 A 
JOIN TABLE2 B 
ON A.ITEM = B.ITEM 
GROUP BY A.ITEM, A.WAREHOUSE, A.VENDOR 
+0

「JOIN TABLE 2 B」はタイプミスです。また、なぜリードタイムが平均であると思いますか?これは、購入日と購入日の最終日ではありませんか?私が言ったように、OPはそれを指定しなければならない。 – Hogan

+0

多くの助けになりました、ありがとうございます! – MrKen

+0

typoが修正されました。ありがとう –

関連する問題