iT邦幫忙

0

請各位幫忙分析這段code

  • 分享至 

  • xImage

以下這段code不知為什麼撈出的資料會不一樣請各位高手指引方向幫忙分析
原始碼如下 MECHANIC_NAME 維修人員,REGISTERDATE 開單日期, PARTSTOTAL(實際更換零件 小計=零件費)
但撈出的資料3月份多出117元,5月份多出1010,350元
但直接下SQL(第二段程式碼)就無以上金額真不知是哪裡出錯了?

select t0.MECHANIC_NAME 維修人員, sum(t0.m1) as '1月',sum(t0.m2) as '2月',sum(t0.m3) as '3月',sum(t0.m4) as '4月',sum(t0.m5) as '5月'
from 
	(
	SELECT MECHANIC_NAME
		  ,year([REGISTERDATE]) as year 
		  , case when month([REGISTERDATE])=1 then ([PARTSTOTAL]) else 0 end as m1  -- REGISTERDATE 開單日期, PARTSTOTAL(實際更換零件 小計=零件費)
		  , case when month([REGISTERDATE])=2 then ([PARTSTOTAL]) else 0 end as m2
		  , case when month([REGISTERDATE])=3 then ([PARTSTOTAL]) else 0 end as m3
		  , case when month([REGISTERDATE])=4 then ([PARTSTOTAL]) else 0 end as m4
		  , case when month ([REGISTERDATE])=5 then ([PARTSTOTAL]) else 0 end as m5
		  --, case when year ([REGISTERDATE])=2022 then ([PARTSTOTAL]) else 0 end as m5
	  FROM wo
	) t0
where t0.year=2022
group by t0.MECHANIC_NAME

第二段程式碼

SELECT MECHANIC_NAME, PARTSTOTAL, REGISTERDATE FROM WO --PARTSTOTAL 實際更換零件 小計,REGISTERDATE 開單日期
where (REGISTERDATE) BETWEEN '20220501' AND '20220531'  AND MECHANIC_NAME like N'%王賢%';

https://ithelp.ithome.com.tw/upload/images/20220628/201486371Xb8QryJSQ.png

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
allenlwh
iT邦高手 1 級 ‧ 2022-06-28 10:28:26
最佳解答

試試這個語法

SELECT MECHANIC_NAME, PARTSTOTAL, REGISTERDATE FROM WO 
--PARTSTOTAL 實際更換零件 小計,REGISTERDATE 開單日期
where convert(varchar,REGISTERDATE,112) like '202205%' 
--我個人習慣:日期型態的欄位,儘量用convert函數來處理
AND MECHANIC_NAME like N'%王賢%';
看更多先前的回應...收起先前的回應...
yu0901 iT邦新手 4 級 ‧ 2022-06-28 10:44:15 檢舉

您好
真不懂為何同一個欄位怎麼撈出來的資料不一樣?
https://ithelp.ithome.com.tw/upload/images/20220628/20148637551kwfONS2.png

左邊是您那段SQL
右邊是我這段

SELECT MECHANIC_NAME, PARTSTOTAL, REGISTERDATE FROM WO --PARTSTOTAL 實際更換零件 小計,REGISTERDATE 開單日期
where (REGISTERDATE) BETWEEN '20220501' AND '20220531'  AND MECHANIC_NAME like N'%王瑋賢%';

其中MECHANIC_NAME 維修人員,REGISTERDATE 開單日期, PARTSTOTAL(實際更換零件 小計=零件費)

yu0901 iT邦新手 4 級 ‧ 2022-06-28 11:07:11 檢舉

上面結果是這段語法
下面結果是另一段語法
真不懂為何會筆數不一樣?
第一段語法

SELECT MECHANIC_NAME, PARTSTOTAL, REGISTERDATE FROM WO --PARTSTOTAL 實際更換零件 小計,REGISTERDATE 開單日期
where (REGISTERDATE) BETWEEN '20220531' AND '20220531'  AND MECHANIC_NAME like N'%王瑋賢%';

第二段語法

SELECT MECHANIC_NAME, PARTSTOTAL, REGISTERDATE FROM WO 
--PARTSTOTAL 實際更換零件 小計,REGISTERDATE 開單日期
where convert(varchar,REGISTERDATE,112) like '20220531' 
--我個人習慣:日期型態的欄位,儘量用convert函數來處理
AND MECHANIC_NAME like N'%王瑋賢%';

https://ithelp.ithome.com.tw/upload/images/20220628/20148637ffevPUxE4g.png

allenlwh iT邦高手 1 級 ‧ 2022-06-28 11:07:26 檢舉

試一下這個

where (REGISTERDATE) BETWEEN '20220501' AND '20220601' 
allenlwh iT邦高手 1 級 ‧ 2022-06-28 11:12:50 檢舉

差異是這三筆(時間是2022-5-31 08:00:00)
解法:

  1. where (REGISTERDATE) BETWEEN '20220531' AND '20220601'
  2. convert(varchar,REGISTERDATE,112) like '20220531'

https://ithelp.ithome.com.tw/upload/images/20220628/20033493x8wvdPZK1h.jpg

allenlwh iT邦高手 1 級 ‧ 2022-06-28 11:14:26 檢舉

所以,我個人習慣,並不喜歡用 BETWEEN

yu0901 iT邦新手 4 級 ‧ 2022-06-28 11:24:01 檢舉

明白了!
往後還是採用您指導的正規搜尋日期方式convert(varchar)
感謝

首先問題是在資料型別

where (REGISTERDATE) BETWEEN '20220501' AND '20220531'

REGISTERDATE 是 Datetime 型別,你用字串來作比較的時候會被轉型

convert(datetime, '20220531', 112) => 2022-05-31 00:00:00.000

然後是 BETWEEN,BETWEEN 本身沒有問題,有問題的是用的人不懂 BETWEEN 在做什麼

SELECT * FROM WO
where (REGISTERDATE) BETWEEN '20220501' AND '20220531'

SELECT * FROM WO
where (REGISTERDATE) >= '20220501' 
AND   (REGISTERDATE) <= '20220531'

兩段程式是相同的,因為 BETWEEN 等效於 x >= n1 and x <= n2

綜合上面兩點,原本的語法

SELECT MECHANIC_NAME, PARTSTOTAL, REGISTERDATE FROM WO 
where (REGISTERDATE) BETWEEN '20220531' AND '20220531'  AND MECHANIC_NAME like N'%王瑋賢%';

等於是

SELECT MECHANIC_NAME, PARTSTOTAL, REGISTERDATE FROM WO
where (REGISTERDATE) >= '2022-05-31 00:00:00.000' 
AND (REGISTERDATE) <= '2022-05-31 00:00:00.000'  
AND MECHANIC_NAME like N'%王瑋賢%';

所以 2022-05-31 08:00:00.000 的資料本來就不會被撈出來

再來下面這個語法下的條件

where (REGISTERDATE) BETWEEN '20220501' AND '20220601'

如果資料中有 2022-06-01 00:00:00.000 的資料時就會被撈出來,這會是你想要的結果嗎?


我也習慣把 datetime 轉成 varchar 來處理日期比較,但你不會一直用 like 來當比較條件,如果今天要查 2022-05-05 到 2022-05-25 的資料,like 要怎麼下?

已經有經驗的人當然可以選擇自己喜歡的方式,只要他知道自己在幹嘛就好。初學者遇到這種問題不去搞懂的話就會很難成長。

yu0901 iT邦新手 4 級 ‧ 2022-06-30 10:55:10 檢舉

感謝您!解釋的非常清楚

我要發表回答

立即登入回答