2017-08-11 100 views
0

我是SQL中的新用戶,我可以使用一些幫助與我的代碼,請幫助!SQL Server多表多個過濾器

我有兩個表:表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在6,8和10天內從供應商x抵達倉庫y,則交貨時間將是該供應商和該倉庫的這些天(8天)的平均值。

請幫忙!

在此先感謝

編輯:AFTER幫助在這裏是我的新代碼..謝謝!

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 -style-joins.aspx) - 在ANSI - ** 92 ** SQL標準中(** 25年*),舊式*逗號分隔的表*樣式列表已替換爲* proper * ANSI'JOIN'語法*前),其使用是不鼓勵的 –

+1

你想添加前置時間,你告訴我們,但你不告訴我們什麼時間。什麼是交貨時間? – Hogan

回答

2

你的代碼是不正確的,你加入到B,但然後有一個子查詢的值在哪裏。這裏的=過濾B中的值不設置值。

由於@marc_s建議這裏是如何編寫這個SQL,而不使用25歲的語法。

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 

你也可以做到這一點與一窗口功能(參見之前的版本,如果你的關心。)

+0

謝謝!我發佈了我的新代碼,它功能強大。日期格式爲1yymmdd,有沒有辦法解決這個問題? – MrKen

1

下面是查詢以獲得類似的結果在Microsoft SQL Server。

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

固定錯字。謝謝 –