iT邦幫忙

0

MS SQL 查詢的方法

https://ithelp.ithome.com.tw/upload/images/20190816/20119845Dxq6eW0rSn.png

請問這個表格 我想要select出會修冰箱和修手機的人(D)
我有試著用WHERE 利用子查詢先查出會修手機的人員 再 AND 技能 = ‘修冰箱的’ 的資料
但是如果需要的條件更多 就更複雜了
請問還有有甚麼方法可以解決的

1
小魚
iT邦高手 1 級 ‧ 2019-08-17 00:21:36
最佳解答

我也來試試看吧,
基本上我不建議欄位用中文,

建立資料表

IF OBJECT_ID('test.dbo.skill') IS NULL CREATE TABLE [test].[dbo].[skill]
( [skill] NVARCHAR(10) NOT NULL,
  [member] NVARCHAR(10) NOT NULL);

新增資料

INSERT INTO [test].[dbo].[skill] ([skill], [member]) VALUES
(N'修電腦', 'B'), (N'修電腦', 'C'), (N'修手機', 'A'),
(N'修手機', 'C'), (N'修手機', 'D'), (N'修冷氣', 'A'),
(N'修冷氣', 'B'), (N'修冰箱', 'D'), (N'修電視', 'A'),
(N'修電視', 'C');

查詢資料

SELECT COUNT(1) AS num, [member] FROM [test].[dbo].[skill]
WHERE [skill] IN ('修手機', '修冰箱')
GROUP BY [member]
HAVING COUNT(1) >= 2;

查詢結果
https://ithelp.ithome.com.tw/upload/images/20190817/20105694TYOZCw4hiI.png

其中IN後面的內容和數字2由後端產生

1
firecold
iT邦新手 5 級 ‧ 2019-08-16 10:44:03

考量到目前資料庫的結構
跟後續可能會有更多同時會的技能要算

我應該會WHERE 技能 IN(技能1, 技能2)
抓出來之後
用程式分會技能的人物array
在去in_array()篩選

2
fuzzylee1688
iT邦新手 2 級 ‧ 2019-08-16 10:53:28

參考看看..

select 人員, count(*) skillcnt
 from (
-- 選二項技能 
SELECT 技能, 人員
FROM TableA
where 技能='修電腦'
union
SELECT 技能, 人員
FROM TableA
where 技能='修手機'
....
...
..
  ) AAA
group by 人員
having count(*) = 2
2
japhenchen
iT邦新手 2 級 ‧ 2019-08-16 12:07:51
SELECT 人員,
	STUFF((SELECT '. '+技能 
		FROM 人員TABLE AS B 
		WHERE B.人員=A.人員
		FOR XML PATH(''),Type).value('.','NVARCHAR(MAX)'),1,2,'') AS 他會的技能
FROM 人員TABLE AS A 
WHERE 技能 IN ('修電腦','修冰箱')
GROUP BY 人員

RESULTS.......一人一串,列出會修手機或修冰箱的,用in

看更多先前的回應...收起先前的回應...

https://ithelp.ithome.com.tw/upload/images/20190816/20117954hZ37GVmtQE.jpg
https://ithelp.ithome.com.tw/upload/images/20190816/20117954b8PE8osMc4.jpg

'修冰箱','修電腦' 不行哦. 呵..

..

把上面那段做成檢視

CREATE VIEW [dbo].[vw_技能表]
as
SELECT 人員,
	STUFF((SELECT '. '+技能 
		FROM 人員TABLE AS B 
		WHERE B.人員=A.人員
		FOR XML PATH(''),Type).value('.','NVARCHAR(MAX)'),1,2,'') AS 他會的技能
FROM 人員TABLE AS A 
GROUP BY 人員

GO

再查檢視,一定可以

select * from vw_技能表
where 他會的技能 like '%修手機%' and  他會的技能 like '%修冰箱%' 

fuzzylee1688
樓主的表裡沒有人同時會修冰箱跟電腦耶!
https://ithelp.ithome.com.tw/upload/images/20190816/20117954lHSmdMZk76.jpg

大哥, 樓主感覺沒想要用 "and".

那簡單點用IN,但這只要符合其中任一條件就可以,如果要同時符合多項條件,那真的非AND不可

我把大哥回答稍作調整
這樣呢?

CREATE VIEW [dbo].[vw_技能表]
as
  SELECT 人員
			,(SELECT 技能
			    FROM TABLE_NAME AS A 
			   WHERE A.欄位1 = B.欄位1 
			   FOR XML PATH()
			 )AS 他會的技能
	  FROM TABLE_NAME AS B
	GROUP BY 人員
GO

SELECT * FROM vw_技能表 WHERE 他會的技能 = '修電腦修冰箱'

確實就只有一個WHERE條件/images/emoticon/emoticon25.gif

我要發表回答

立即登入回答