SELECT
CASE
WHEN ABS(DATEDIFF( DAY ,[REQUEST_DATE] ,[DILIVERY_DATE])) > 1 THEN 0
ELSE 1
END AS DELIVERY_MEET_REQUIRE_WEIGHT
FROM .....
WHERE .....
//หรือจะนับเลย
SELECT COUNT([PRIMARY_KEY]) AS COUNT_DELIVERY_MEET_REQUIRE
FROM .....
WHERE ( ABS(DATEDIFF( DAY ,[REQUEST_DATE] ,[DILIVERY_DATE])) <= 1 )
......
SELECT
CASE TOTAL_RECORD
WHEN 0 THEN 0
ELSE (TOTAL_PERFORMANCE/TOTAL_RECORD)
END AS PERFORMANCE
FROM
(
Select
(
SELECT Count(StockCode) As SC
FROM test2 WHERE (ABS(DATEDIFF( DAY ,[REQUESTDATE] ,[DELIVERYDATE])) <= 1 )
) as TOTAL_PERFORMANCE ,
(
select COUNT([OrderLineID]) from test2
) AS TOTAL_RECORD
// แบบสั้นจะได้ว่า
SELECT AVG(DELIVERY_MEET_REQUIRE_WEIGHT) AS DELIVERY_PERFORMANCE
FROM
(
SELECT
CASE
WHEN ABS(DATEDIFF( DAY ,[REQUEST_DATE] ,[DILIVERY_DATE])) > 1 THEN 0
ELSE 1
END AS DELIVERY_MEET_REQUIRE_WEIGHT
FROM [TableName]
) AS PRIMARY_QUERY
//Comment
// ใน sub query จะมีการแปลงค่า Delivery date กับ Request date ตามเงื่อนไข
// แต่จำนวน record จะเท่าเดิมค่ะ ฉะนันจึงใช้ Aggregate function AVG ได้เลย
// ส่วนตัวอย่างของคุณส้มโอ ทำดีมากค่ะมีการตรวจเพื่อป้องกันไม่ให้เกิด Divide by Zero
// แค่เข้าใจผิดไปเรื่องนึง
(
SELECT Count(StockCode) As SC
FROM test2 WHERE (ABS(DATEDIFF( DAY ,[REQUESTDATE] ,[DELIVERYDATE])) <= 1 )
) as TOTAL_PERFORMANCE
// คือ TOTAL_PERFORMANCE เป็น Table Alias นะคะไม่ใช่ชื่อ FIELD หากต้องการค่า ผมรวมจากใน
// Sub query นี้ต้องอ้างแบบนี้ค่ะ TOTAL_PERFORMANCE.SC ไม่ใช่ TOTAL_PERFORMANCE โดดๆค่ะ
// เช่นเดียวกันกับ
(
select COUNT([OrderLineID]) AS REC_COUNT from test2
) AS TOTAL_RECORD
// TOTAL_RECORD คือ Table Alias ค่ะ
// พอนำไปอ้างที่ Main Query จึง Error ค่ะ
// ถ้าจะแก้ QUERY ของคุณส้มโอจะได้ประมาณนี้ค่ะ
SELECT
CASE TOTAL_RECORD
WHEN 0 THEN 0
ELSE (DELIVERY_WEIGHT / TOTAL_RECORD )
END AS DELIVERY_PERFORMANCE
FROM
Select
(
SELECT Count(StockCode) As DELIVERY_WEIGHT
FROM test2 WHERE (ABS(DATEDIFF( DAY ,[REQUESTDATE] ,[DELIVERYDATE])) <= 1 )
) as SUBQUERY_TO_GET_DELIVERY_WEIGHT
,
(
select COUNT([OrderLineID]) AS TOTAL_RECORD
from test2
) as SUBQUERY_TO_GET_TOTAL_RECORD
// คือการสร้าง SubQuery ตัวแปลของ SQL จะเข้าใจว่าเปนการอ้างตารางมาอีกตารางค่ะ
// และเนื่องจาก SubQuery ทั้งสอง มีจำนวน Record เพียง SubQuery ละ 1 Record
// เราจึงนำมา Dot Product ได้เลยไม่จำเป็นต้องใช้การเชื่อมใดอื่นอีก
// ส่วนท่อนบน เขียนให้ชัดๆได้ว่า
SELECT
CASE SUBQUERY_TO_GET_TOTAL_RECORD.TOTAL_RECORD
WHEN 0 THEN 0
ELSE (SUBQUERY_TO_GET_DELIVERY_WEIGHT.DELIVERY_WEIGHT / SUBQUERY_TO_GET_TOTAL_RECORD.TOTAL_RECORD )
END AS DELIVERY_PERFORMANCE
// Postscript
// 1. ตั้งชื่อตัวแปรสำคัญเสมออย่างน้อยก็ตั้งเป็น ภาษาคาราโอเกะ ไปค่ะทำอะไรจะได้เข้าใจง่าย
// 2. ถึงแม้ว่าใน MSSQLSERVER จะไม่บังคับว่าต้องใช้ AS เมื่อกำหนด Field Alias หรือ Table Alias
// แต่ขอ strong recommend ว่าควรใช้เสมอ เพื่อจะได้เป็นที่สังเกตุว่าเรามีการเปลี่ยนชื่ออะไรบางอย่าง
// 3. เมื่อใดมีการใช้ Aggregate function SUM ,AVG ,COUNT ,MAX ,MIN etc sหรือ Function อื่นๆ
// หรือมีการกระทำกับ field เช่น NAME + ' ' + SUR_NAME ควรมีการตั้งชื่อ Field นั้นใหม่เสมอค่ะ
// ********************************************************************************************
// ควรไม่ควรแล้วแต่จะเห็นควรค่ะ ^ ^
แต่อยากสอบถามหน่อยคะ คือใน sql เนี่ย มันเขียน if else ได้ใช่มั้ยคะ
แล้วถ้าอยากใส่โค๊ตประมาณนี้เข้าไป จะต้องเขียนแบบไหนหรอคะ
if (Stock_Transaction_File.Warehouse No="01" or
Stock_Transaction_File.Warehouse No ="02" or
Stock_Transaction_File.Warehouse No ="04" or
Stock_Transaction_File.Warehouse No ="06" or
Stock_Transaction_File.Warehouse No ="SAMPLE") and
Stock_Transaction_File.Transact Type ="00" and
Stock_Transaction_File.Transact Date >={?FrDate}
then
Stock_Transaction_File.Quantity //เอาจำนวนสินค้าออกมา
else
if (Stock_Transaction_File.Warehouse No ="01" or
Stock_Transaction_File.Warehouse No ="02" or
Stock_Transaction_File.Warehouse No ="04" or
Stock_Transaction_File.Warehouse No ="06" or
Stock_Transaction_File.Warehouse No ="SAMPLE") and
Stock_Transaction_File.Transact Type ="02" and
Stock_Transaction_File.Transact Date >={?FrDate} and
Stock_Transaction_File.Quantity > 0
then
Stock_Transaction_File.Quantity // เอาจำนวนสินค้าออกมา
else
if (Stock_Transaction_File.Warehouse No ="01" or
Stock_Transaction_File.Warehouse No ="02" or
Stock_Transaction_File.Warehouse No ="04" or
Stock_Transaction_File.Warehouse No ="06" or
Stock_Transaction_File.Warehouse No ="SAMPLE") and
Stock_Transaction_File.Transact Type ="04" and
Stock_Transaction_File.Transact Date >={?FrDate} and
Stock_Transaction_File.Quantity > 0
then
Stock_Transaction_File.Quantity // เอาจำนวนสินค้าออกมา
else
0 // ใส่จำนวนเป็น 0
ถ้าใน STRING ที่ผ่านไปยัง SERVER โดย .NET ไมว่าจะ OleDB ,ODBC หรือ .NET Provider
ใช้ IF ELSE ไม่ได้ค่ะ จะใช้ในการเขียน STORE PROCEDURE
ถ้าต้องการครวจสอบเงื่อนไข ปกติจะใช้ CASE .. WHEN ... THEN ... ELSE ... END ค่ะ
สำหรับ MSSQL SERVER นะคะ
SELECT
CASE
WHEN (Stock_Transaction_File.Warehouse No = "01") OR (Stock_Transaction_File.Warehouse No = "02")
OR (Stock_Transaction_File.Warehouse No = "03") OR (Stock_Transaction_File.Warehouse No = "04")
OR (Stock_Transaction_File.Warehouse No = "SAMPLE")
THEN
CASE
WHEN (Stock_Transaction_File.Transact Type ="00" ) AND (Stock_Transaction_File.Transact Date >=@VAR_FrDate )
THEN Stock_Transaction_File.Quantity
WHEN (Stock_Transaction_File.Transact Type ="02" ) AND (Stock_Transaction_File.Transact Date >=@VAR_FrDate )
AND (Stock_Transaction_File.Quantity > 0)
THEN Stock_Transaction_File.Quantity
WHEN (Stock_Transaction_File.Transact Type ="04" ) AND (Stock_Transaction_File.Transact Date >=@VAR_FrDate )
AND (Stock_Transaction_File.Quantity > 0)
THEN Stock_Transaction_File.Quantity
END
ELSE 0
END
FROM ...
// เนื่องจากไม่ทราบความหมายและจุดประสงค์เลยเขียนตามตัวอย่างค่ะ
// สังเกตุว่า เงื่อนไขของ CASE ที่ซ้อนอยู่ข้างใน ผลลัพธ์คือ FIELD เดียวกัน
// ดังนั้นจึงน่าจะเชื่อมกันด้วย OR ได้