台灣最大程式設計社群網站
線上人數
558
 
會員總數:245598
討論主題:189304
歡迎您免費加入會員
討論區列表 >> MS SQL >> SQL語法怎麼下?UNION
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
SQL語法怎麼下?UNION
價值 : 30 QP  點閱數:2751 回應數:8

樓主


初學者
15 119
1590 323
發送站內信

(1) 我想從Table1中,查出不同代號,在不同期間內,最接近 "最大日期" 那1日的"銷售量"
因為每筆產品,不是天天都有銷售量,但在1個月內一定會有銷售記錄
若是以 20140130日期 (最大日期)為準,最接近它的有可能是 20140125賣出去5個,
所以我克意定了一個日期範圍,以減低 DESC 排序所花的時間。
如下:(但SQL語法出錯,怎改呢?)



錯誤訊息 156,層級 15,狀態 1,行 2
接近關鍵字 'UNION' 之處的語法不正確。
---------------------------------------------------------------
(2) 也是UNION,下面是OK的


但是我想將 [代號]一併輸出來時,下面的寫法出錯了,怎改呢?

錯誤訊息 8120,層級 16,狀態 1,行 1
資料行 'TEMP.代號' 在選取清單中無效,因為它並未包含在彙總函式或 GROUP BY 子句中。

本篇文章發表於2014-01-31 22:19
== 簽名檔 ==
--
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

pilipala
檢舉此回應

第一個寫法會出錯是因為 union 對於 order by 限制,只能放在語法最後面;第二個語法則是剛好避開這個限制
第三種寫法出錯是因為,使用彙總函數時,沒有使用彙總函數的欄位,必須包含在 group by 內,你完全沒有寫 group by

最後提醒這個 where 條件 〔日期 < = 20140120 AND 日期 >= 20140101〕,會造成隱含式轉換,
有設定 index 前提下,會導致 index scan,該 index 沒有發揮作用,最好改為 〔日期 < = '20140120' AND 日期 >= '20140101'〕,應該用字串,而非數字
本篇文章回覆於2014-02-01 00:31
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應


檢舉此回應
回 pilipala 大大
我的日期是 int32 格式,即 20140105 格式,非 #01/05/2014# 格式哦。
請教...要麼改寫呢?还是不懂?
本篇文章回覆於2014-02-01 03:44
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

pilipala
檢舉此回應
我的日期是 int32 格式


那就不要理會 1F 所說的最後一段,請問使用的資料庫是甚麼啊 ~~ ^^??

請教...要麼改寫呢?还是不懂?


UNION http://technet.microsoft.com/zh-tw/library/ms180026.aspx
GROUP BY http://technet.microsoft.com/zh-tw/library/ms177673.aspx
本篇文章回覆於2014-02-01 08:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應


檢舉此回應
回 pilipala 大大,我是用MS-SQL Server 2012
本篇文章回覆於2014-02-01 09:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應


檢舉此回應
我的問題(1)在於

最接近 "最大日期" 那1日的"銷售量"
因為每筆產品,"不"是天天都有銷售量,若是以 20140130日期 (此為最大日期,或基準日)為準,最接近它的有可能是 20140125賣出去5個。
所以必須要用 ORDER BY 日期 desc

但多了 ORDER 就會出錯,我不知道要如何挑出最接近"基準日"的那1筆?而且又可以用 UNION 把全部查到的結果組成1張表(dataTable)
本篇文章回覆於2014-02-01 10:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應


檢舉此回應
代號  日期   銷售量
1101 20140105  5
1101 20140108  8
1101 20140127  7 <= 要能找到此筆
1101 20140205  3
本篇文章回覆於2014-02-02 13:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應


檢舉此回應
上面範例是指若是以 20140130日期 (最大日期)為準,最接近的那1天是 20140127,銷售量=7
本篇文章回覆於2014-02-02 13:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
最有價值解答

pilipala
檢舉此回應

需求建議方式:
方法一:利用次序函數 row_number() 去作
方法二:堅持一定要用 top 搭配 order by 去作的話,請利用 TVF(Table Value Function) 搭配 cross apply 或 outer apply 來作
本篇文章回覆於2014-02-02 22:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.