iT邦幫忙

0

MS SQL UNION 後進階排序問題 請教

各位大大好
最近小弟在做一個篩選頁面的 ComboBox 選單
其中一個 ComboBox 我希望可以除了選擇資料表中的欄位資料以外,還能自己額外加入選項

預期結果如下範例:

  1. ---ALL--- (自己加的DATA,排序要在最上面)
  2. 王小明 (原資料表DATA)
  3. 葉大雄 (原資料表DATA)
  4. 多拉A夢 (原資料表DATA)
  5. ---不選--- (自己加的DATA,排序要在最下面)

我的 SQL Code 如下:

select [Name]
from [DB].[dbo].[my_table]
Union
Select '---ALL---'
Union
Select '---不選擇---'
Order by
    case when [EnName]='---ALL---' then 0
         when [EnName]='---不選---' then 2
         else 1
    end

不過這樣寫法會報錯:
「如果陳述式中包含 UNION、INTERSECT 或 EXCEPT 運算子,則選取清單中必須有 ORDER BY 項目。」

有點不太知道要怎麼修正 SQL 的寫法,希望版上大大能給予指點。
感恩感恩~

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
3
海綿寶寶
iT邦大神 1 級 ‧ 2021-11-04 10:46:21
最佳解答

參考看看合不合用...

https://ithelp.ithome.com.tw/upload/images/20211104/20001787u3STU0JcEi.png

huahualiu iT邦新手 2 級 ‧ 2021-11-04 13:26:30 檢舉

謝謝
這樣簡潔很多
我把這結合 一級屠豬士 大大的方法
就可以簡潔地寫出我要的結果了

最後結果參考:

WITH [select_index]
AS (
	SELECT [Name], 1 as [ord]
	FROM [DB].[dbo].[my_table]
	UNION 
	SELECT '--- ALL ---' as [EnName], 0 as [ord]
	UNION
	SELECT '--- None ---' as [EnName], 2 as [ord]
	)
select [Name]
FROM [select_index]
ORDER BY [ord] ASC
commit
2
w4560000
iT邦研究生 5 級 ‧ 2021-11-04 10:05:06
	DECLARE @TmpTable TABLE ( Name varchar(20) )

	INSERT INTO @TmpTable
	SELECT '王小明' UNION
	SELECT '葉大雄' UNION
	SELECT '多拉A夢'

	SELECT '---ALL---' AS 'Name'
	UNION
	SELECT [Name]
	FROM @TmpTable
3
一級屠豬士
iT邦大師 1 級 ‧ 2021-11-04 10:23:47
create table t1104 (
  id int
, n text
);

insert into t1104 values
(1, '王小明'),(2,'葉大雄'),(3,'多拉A夢');

with t1(n) as (
select n
  from t1104
 order by id
), t2(n, ordertag) as (
select '---ALL---', 0
union all
select n, 1
  from t1
union all
select '---不選擇---', 2
)
select n
  from t2
 order by ordertag;
 
      n
--------------
 ---ALL---
 王小明
 葉大雄
 多拉A夢
 ---不選擇---
(5 rows)
huahualiu iT邦新手 2 級 ‧ 2021-11-04 10:59:30 檢舉

謝謝大大
都差點忘記 With 可以這樣用了XD

2
rogeryao
iT邦超人 8 級 ‧ 2021-11-04 11:13:44
CREATE TABLE [dbo].[my_table] (
  [Name] nvarchar(20));

INSERT INTO my_table ([NAME])
  VALUES (N'王小明'),
  (N'葉大雄'),
  -- 額外加入
  (N'葉大雄'),
  (N'多拉A夢');
SELECT [NO],[Name]
FROM (
SELECT [Name],RoW_NumBer() OVER (ORDER BY [Name]) AS [NO]
FROM [my_table]
GROUP BY [Name]
UNION
SELECT  N'---ALL---' AS [Name] , 0 AS [NO]
FROM [my_table]
UNION
SELECT N'---不選擇---' AS [Name], COUNT(DISTINCT[Name]) + 1 AS NO
FROM [my_table]
) AS M
ORDER BY NO

Demo

我要發表回答

立即登入回答