2012-06-13 40 views
1

我有3個表格:Delivery,IssuedWarehouse,ReturnedStock。SQL命令中的組子句

Deliveries: ID, OrderNumber, Material, Width, Gauge, DelKG 
IssuedWarehouse: OrderNumber, IssuedKG 
ReturnedStock: OrderNumber, IssuedKG 

我希望做的是組中的所有訂單的材料,寬度和規範再總結交付量,發給倉庫及發行回股票。

這是真的是相當接近的SQL:

SELECT 
    DELIVERIES.Material, 
    DELIVERIES.Width, 
    DELIVERIES.Gauge, 
    Count(DELIVERIES.OrderNo) AS [Orders Placed], 
    Sum(DELIVERIES.DeldQtyKilos) AS [KG Delivered], 
    Sum(IssuedWarehouse.[Qty Issued]) AS [Film Issued], 
    Sum([Film Retns].[Qty Issued]) AS [Film Returned], 
    [KG Delivered]-[Film Issued]+[Film Returned] AS [Qty Remaining] 

FROM (DELIVERIES 
INNER JOIN IssuedWarehouse 
    ON DELIVERIES.OrderNo = IssuedWarehouse.[Order No From]) 
INNER JOIN [Film Retns] 
    ON DELIVERIES.OrderNo = [Film Retns].[Order No From] 
GROUP BY Material, Width, Gauge, ActDelDate 
HAVING ActDelDate Between [start date] And [end date] 
ORDER BY DELIVERIES.Material; 

這組產品幾乎是完美的。但是,如果您看一下結果:

Material Width Gauge Orders Placed Delivered Qnty Kilos Film Issued Film Returned Qty Remaining 
COEX-GLOSS 590  75  1    534      500   124    158 
COEX-MATT 1080 80  1    4226     4226  52    52 
CPP   660  38  8    6720     2768  1384   5336 
CPP   666  47  1    5677     5716  536    497 
CPP   690  65  2    1232     717   202    717 
CPP   760  38  3    3444     1318  510    2636 
CPP   770  38  4    4316     3318  2592   3590 
CPP   786  38  2    672      442   212    442 
CPP   800  47  1    1122     1122  116    116 
CPP   810  47  1    1127     1134  69    62 
CPP   810  47  2    2250     1285  320    1285 
CPP   1460 38  12    6540     4704  2442   4278 
LD   975  75  1    502      502   182    182 
LDPE  450  50  1    252      252   50    50 
LDPE  520  70  1    250      250   95    95 
LDPE  570  65  2    504      295   86    295 
LDPE  570  65  2    508      278   48    278 
LDPE  620  50  1    252      252   67    67 
LDPE  660  50  1    256      256   62    62 
LDPE  670  75  1    248      248   80    80 
LDPE  690  47  1    476      476   390    390 
LDPE  790  38  2    2104     1122  140    1122 
LDPE  790  50  1    286      286   134    134 
LDPE  790  50  1    250      250   125    125 
LDPE  810  30  1    4062     4062  100    100 
LDPE  843  33  1    408      408   835    835 
LDPE  850  80  1    412      412   34    34 
LDPE  855  30  1    740      740   83    83 
LDPE  880  60  1    304      304   130    130 
LDPE  900  70  2    1000     650   500    850 
LDPE  1017 60  1    1056     1056  174    174 
OPP   25  1100 1    381      381   95    95 
OPP   1000 30  2    1358     1112  300    546 
OPP   1000 30  1    1492     1491  100    101 
OPP   1200 20  1    418      417   461    462 
PET   760  12  3    1227     1876  132    -517 

您會看到有一些材料具有相同的寬度和厚度但尚未分組。我認爲這是因爲訂單上交付的數量不同。例如:

Material Width Gauge Orders Placed Delivered Qnty Kilos Film Issued Film Returned Qty Remaining 
LDPE  620  50  1    252      252   67    67 
LDPE  660  50  1    256      256   62    62 

我想這兩行是分組的。他們有相同的材料,寬度和規格,但交付的數量是不同的,因此它沒有分組。

任何人都可以幫助我組這些奇怪的行嗎?

+3

請學習如何以正確的方式進行格式化。謝謝。 – DonCallisto

+0

請格式化您的問題 – pablochan

+2

我認爲您需要從您的「GROUP BY」語句中刪除ActDelDate。然而,你的問題是不明確的,你給出的例子2行有不同的寬度(620和660)? – GarethD

回答

0

您正在按交貨日期進行分組,這會導致行被拆分。要麼從結果中刪除交貨日期,要麼按照交貨日期的最小/最大值進行分組。

1

您的「問題」是交貨發生在不同的日期,並且您正在按ActDelDate進行分組,因此數據發生分裂,但是因爲您沒有選擇ActDelDate列,所以這並不明顯。

修復的方法是:通過列表從該組刪除ActDelDate


你也應該刪除繞第一會合不必要的括號,並改變

HAVING ActDelDate Between [start date] And [end date] 

WHERE ActDelDate Between [start date] And [end date] 

並在之前有的GROUP BY