2016-12-15 61 views
1

希望你能有所幫助。SQL查詢提供行數銷售訂單

我們有一個顯示網格的應用程序。我們可以使用我正在掙扎的子查詢將自定義字段添加到網格中。主網格查詢看起來像這樣。

SELECT TOP 300000 
'' AS alloc_status 
,'' AS stock_status 
,wo_description 
,wo_quantity 
,wo_number 
,wo_pwos_id 
,vad_variant_code 
,oh_order_number 
,oh_datetime 
,ohd_dm_id 
,ohd_customer_name 
,vad_description AS vad_description_Condition 
,vad_variant_code AS vad_variant_code_Condition 
,wo_id AS key_id 
FROM works_order 
LEFT OUTER JOIN works_order_analysis 
ON works_order_analysis.woa_wo_id = works_order.wo_id 
LEFT OUTER JOIN works_order_process 
ON works_order_process.wop_id = works_order.wo_current_wop_id 
LEFT OUTER JOIN works_order_process_analysis 
ON works_order_process_analysis.wopa_wop_id = works_order_process.wop_id 
INNER JOIN variant_detail 
ON variant_detail.vad_id = works_order.wo_vad_id 
LEFT OUTER JOIN works_order_total 
ON works_order.wo_id = works_order_total.wot_wo_id 
LEFT JOIN order_line_item 
ON oli_id = wo_oli_id 
LEFT JOIN order_header 
ON oh_id = oli_oh_id 
LEFT JOIN job_number 
ON jn_id = wo_jn_id 
LEFT JOIN works_order_process_subcontract_analysis 
ON wopsa_wop_id = wop_id 
LEFT JOIN order_header_detail 
ON ohd_oh_id = oh_id 
LEFT JOIN customer_detail 
ON cd_id = oh_cd_id 
WHERE ((cd_ow_account = 'NOTHS') 
AND (wo_pwos_id = 1) 
OR (cd_ow_account = 'EBAY') 
AND (wo_pwos_id = 1) 
OR (cd_ow_account = '4008') 
AND (wo_pwos_id = 1) 
OR (cd_ow_account = 'TRUSCA') 
AND (wo_pwos_id = 1)) 
AND ((wo_required_datetime <= '2016-12-24 23:59:59' 
OR wo_required_datetime IS NULL) 
AND (wo_wos_id <> 4) 
AND (wo_kit = 0)) 

子查詢基本上提供一個查看銷售訂單並返回該訂單內行數的列。當我這樣做,我得到如下:

有檢索數據的問題: 子查詢返回的多個值。當子查詢遵循=,!=,<等 或子查詢用作表達式時,這是不允許的

下面是查詢與子查詢完成。如果有人能夠幫助這將是驚人的

SELECT TOP 300000 
'' AS alloc_status 
,'' AS stock_status 
,wo_description 
,wo_quantity 
,wo_number 
,wo_pwos_id 
,vad_variant_code 
,oh_order_number 
,oh_datetime 
,ohd_dm_id 
,ohd_customer_name 
,(SELECT 
COUNT(order_line_item.oli_id) AS 'Count' 
FROM dbo.order_line_item 
INNER JOIN dbo.order_header 
ON order_line_item.oli_oh_id = order_header.oh_id 
INNER JOIN dbo.variant_detail 
ON order_line_item.oli_vad_id = variant_detail.vad_id 
INNER JOIN dbo.variant_setting 
ON variant_setting.vas_vad_id = variant_detail.vad_id 
WHERE variant_setting.vas_manufactured_variant = 1 
GROUP BY order_header.oh_order_number) 
AS CustomLineCount 
,vad_description AS vad_description_Condition 
,vad_variant_code AS vad_variant_code_Condition 
,wo_id AS key_id 
FROM works_order 
LEFT OUTER JOIN works_order_analysis 
ON works_order_analysis.woa_wo_id = works_order.wo_id 
LEFT OUTER JOIN works_order_process 
ON works_order_process.wop_id = works_order.wo_current_wop_id 
LEFT OUTER JOIN works_order_process_analysis 
ON works_order_process_analysis.wopa_wop_id = works_order_process.wop_id 
INNER JOIN variant_detail 
ON variant_detail.vad_id = works_order.wo_vad_id 
LEFT OUTER JOIN works_order_total 
ON works_order.wo_id = works_order_total.wot_wo_id 
LEFT JOIN order_line_item 
ON oli_id = wo_oli_id 
LEFT JOIN order_header 
ON oh_id = oli_oh_id 
LEFT JOIN job_number 
ON jn_id = wo_jn_id 
LEFT JOIN works_order_process_subcontract_analysis 
ON wopsa_wop_id = wop_id 
LEFT JOIN order_header_detail 
ON ohd_oh_id = oh_id 
LEFT JOIN customer_detail 
ON cd_id = oh_cd_id 
WHERE ((cd_ow_account = 'NOTHS') 
AND (wo_pwos_id = 1) 
OR (cd_ow_account = 'EBAY') 
AND (wo_pwos_id = 1) 
OR (cd_ow_account = '4008') 
AND (wo_pwos_id = 1) 
OR (cd_ow_account = 'TRUSCA') 
AND (wo_pwos_id = 1)) 
AND ((wo_required_datetime <= '2016-12-24 23:59:59' 
OR wo_required_datetime IS NULL) 
AND (wo_wos_id <> 4) 
AND (wo_kit = 0)) 
+1

在你的子查詢,你可以通過寫組,所以有可能你會得到多行。把子查詢不會有工作 – User

+0

好了,我該如何糾正呢?我不確定這樣你的幫助將非常感激 – TowelsRus

+0

整頓,第一隻執行子查詢,看看它是否是導致多行,如果根據您需要的結果的子查詢,以便更改組的條件。 – Nitin

回答

0

嘗試下面的查詢,它可能會幫助你

SELECT TOP 300000 
'' AS alloc_status 
,'' AS stock_status 
,wo_description 
,wo_quantity 
,wo_number 
,wo_pwos_id 
,vad_variant_code 
,oh_order_number 
,oh_datetime 
,ohd_dm_id 
,ohd_customer_name 
,(SELECT 
COUNT(order_line_item.oli_id) AS 'Count' 
FROM dbo.order_line_item 
INNER JOIN dbo.order_header 
ON order_line_item.oli_oh_id = order_header.oh_id 
INNER JOIN dbo.variant_detail 
ON order_line_item.oli_vad_id = variant_detail.vad_id 
INNER JOIN dbo.variant_setting 
ON variant_setting.vas_vad_id = variant_detail.vad_id 
WHERE variant_setting.vas_manufactured_variant = 1 
and order_header.oh_order_number=ordhead.oh_order_number) 
AS CustomLineCount 
,vad_description AS vad_description_Condition 
,vad_variant_code AS vad_variant_code_Condition 
,wo_id AS key_id 
FROM works_order 
LEFT OUTER JOIN works_order_analysis 
ON works_order_analysis.woa_wo_id = works_order.wo_id 
LEFT OUTER JOIN works_order_process 
ON works_order_process.wop_id = works_order.wo_current_wop_id 
LEFT OUTER JOIN works_order_process_analysis 
ON works_order_process_analysis.wopa_wop_id = works_order_process.wop_id 
INNER JOIN variant_detail 
ON variant_detail.vad_id = works_order.wo_vad_id 
LEFT OUTER JOIN works_order_total 
ON works_order.wo_id = works_order_total.wot_wo_id 
LEFT JOIN order_line_item 
ON oli_id = wo_oli_id 
LEFT JOIN order_header ordhead 
ON oh_id = oli_oh_id 
LEFT JOIN job_number 
ON jn_id = wo_jn_id 
LEFT JOIN works_order_process_subcontract_analysis 
ON wopsa_wop_id = wop_id 
LEFT JOIN order_header_detail 
ON ohd_oh_id = oh_id 
LEFT JOIN customer_detail 
ON cd_id = oh_cd_id 
WHERE ((cd_ow_account = 'NOTHS') 
AND (wo_pwos_id = 1) 
OR (cd_ow_account = 'EBAY') 
AND (wo_pwos_id = 1) 
OR (cd_ow_account = '4008') 
AND (wo_pwos_id = 1) 
OR (cd_ow_account = 'TRUSCA') 
AND (wo_pwos_id = 1)) 
AND ((wo_required_datetime <= '2016-12-24 23:59:59' 
OR wo_required_datetime IS NULL) 
AND (wo_wos_id <> 4) 
AND (wo_kit = 0)) 
0

你的子查詢改成這樣:

(SELECT 
    COUNT(order_line_item.oli_id) AS 'Count' 
FROM dbo.order_line_item 
INNER JOIN dbo.order_header 
ON order_line_item.oli_oh_id = order_header.oh_id 
INNER JOIN dbo.variant_detail 
ON order_line_item.oli_vad_id = variant_detail.vad_id 
INNER JOIN dbo.variant_setting 
ON variant_setting.vas_vad_id = variant_detail.vad_id 
WHERE variant_setting.vas_manufactured_variant = 1 
AND order_header.oh_order_number = OUTER_QUERY_TABLE.SAME_FIELD) 

我添加這一行:

AND order_header.oh_order_number = OUTER_QUERY_TABLE.SAME_FIELD 

你必須讓這個查詢相關,因此添加條件以將記錄匹配到外部查詢。我不知道它是哪個領域。

您也可以優化您的WHERE,使其與IN()更具可讀性:

WHERE wo_pwos_id = 1 
    AND cd_ow_account IN('NOTHS','EBAY','4008','TRUSCA') 
    AND (wo_required_datetime <= '2016-12-24 23:59:59' OR wo_required_datetime IS NULL) 
    AND wo_wos_id <> 4 
    AND wo_kit = 0