none
請問VB.NET中,可否判斷資料庫中的一個欄位內有二筆或多筆資料? RRS feed

  • 問題

  • 各位先進,請問一下,我用VB.NETSQL做資料庫的灰關聯分析

    目前有個問題,可否在SQL內的欄位KEY二筆資料

    假設某位同學國文第一次考不及格,補考之後及格,所以一個欄位填二筆資料

    姓名

    國文

    英文

    數學

    物理

    林小明

    59,90

    70

    89

    70

    我可能會需要這國文欄位最低分和最高分

    不知道在VB.NET中,有沒有什麼語法可以判斷這個欄位?

     

    不然的話,我只好寫成二個列做分析

    姓名

    國文

    英文

    數學

    物理

    林小明

    59

    70

    89

    70

    林小明

    90

    70

    89

    70

    假設國文英文不及格需皆要補考,之後的欄位就愈來愈多了

    姓名

    國文

    英文

    數學

    物理

    林小明

    59

    38

    89

    70

    林小明

    90

    70

    89

    70

    林小明

    59

    70

    89

    70

    林小明

    90

    38

    89

    70

     

    請問各位先進,有沒有什麼語法可以解決我的問題?

    謝謝

    • 已移動 Bill ChungMVP 2011年10月23日 上午 03:44 (從:.NET Framework(.NET Framework General))
    2011年10月22日 下午 02:31

解答

  • 根據你的描述,我做了一個簡單的實驗,有興趣可以參考看看在調整成符合你真正需求的樣子。

    不過如同心冷大和Bill大所說,你不妨可以study一下有關SQL語法及資料庫正規劃方面,相信會有很大的助益。

    USE [Northwind]
    GO
    
    /****** Object:  Table [dbo].[Students]    Script Date: 10/23/2011 13:59:00 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[Students](
    	[StudentID] [tinyint] NOT NULL,
    	[Name] [nvarchar](5) NOT NULL,
     CONSTRAINT [PK_Students] PRIMARY KEY CLUSTERED 
    (
    	[StudentID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    
    USE [Northwind]
    GO
    
    /****** Object:  Table [dbo].[Subjects]    Script Date: 10/23/2011 13:59:26 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[Subjects](
    	[SubjectID] [tinyint] NOT NULL,
    	[Name] [nvarchar](5) NOT NULL,
     CONSTRAINT [PK_Subjects] PRIMARY KEY CLUSTERED 
    (
    	[SubjectID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    
    USE [Northwind]
    GO
    
    /****** Object:  Table [dbo].[Scores]    Script Date: 10/23/2011 13:59:48 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[Scores](
    	[SerialNo] [int] IDENTITY(1,1) NOT NULL,
    	[StudentID] [tinyint] NOT NULL,
    	[SubjectID] [tinyint] NOT NULL,
    	[Score] [tinyint] NOT NULL,
    	[UpdateDate] [datetime] NOT NULL,
     CONSTRAINT [PK_Scores] PRIMARY KEY CLUSTERED 
    (
    	[SerialNo] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    ALTER TABLE [dbo].[Scores]  WITH CHECK ADD  CONSTRAINT [FK_Scores_Students] FOREIGN KEY([StudentID])
    REFERENCES [dbo].[Students] ([StudentID])
    GO
    
    ALTER TABLE [dbo].[Scores] CHECK CONSTRAINT [FK_Scores_Students]
    GO
    
    ALTER TABLE [dbo].[Scores]  WITH CHECK ADD  CONSTRAINT [FK_Scores_Subjects] FOREIGN KEY([SubjectID])
    REFERENCES [dbo].[Subjects] ([SubjectID])
    GO
    
    ALTER TABLE [dbo].[Scores] CHECK CONSTRAINT [FK_Scores_Subjects]
    GO
    
    
    delete from dbo.Scores
    delete from dbo.Subjects
    delete from dbo.Students
    go
    
    --建立學生基本資料
    insert into dbo.Students(StudentID,Name) values(1,'林小明'),(2,'王OO')
    
    --建立考試科目資料
    insert into dbo.Subjects(SubjectID,Name) values (1,'國文'),(2,'英文'),(3,'數學'),(4,'物理')
    
    --建立成績資料
    insert into dbo.Scores(StudentID,SubjectID,Score,UpdateDate) values (1,1,50,'20111023'),(1,2,59,'20111023'),(1,3,89,'20111023'),(1,4,70,'20111023'),(2,1,80,'20111023'),(2,2,85,'20111023'),(2,3,25,'20111023'),(2,4,55,'20111023')
    
    --建立補考資料
    insert into dbo.Scores(StudentID,SubjectID,Score,UpdateDate) values (1,1,80,'20111024'),(1,1,90,'20111025'),(1,2,60,'20111024'),(2,3,100,'20111024'),(2,4,99,'20111026')
    
    select t2.Name as StudentName,t3.Name as SubjectName
    			,MIN(t1.score) as MinScore,MAX(t1.Score) as MaxScore
    from dbo.Scores t1
    inner join dbo.Students t2 
    	on t1.StudentID = t2.StudentID
    inner join dbo.Subjects t3
    	on t1.SubjectID = t3.SubjectID
    group by t2.Name,t3.Name
    order by StudentName,SubjectName	
    
    






    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    • 已提議為解答 Johnny.Net 2011年10月24日 下午 12:50
    • 已標示為解答 scolin 2011年10月25日 下午 12:53
    2011年10月23日 上午 06:01

所有回覆

  • 你看看這篇的資料庫結構,是否比較好處理?

    [Access]資料庫 SQL 語法範例


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年10月22日 下午 03:30
  • 上面那個連結還有下集:

    [SQL] SQL Server 與 Access 不同的怪地方:LEFT JOIN


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年10月22日 下午 03:32
  • 請參考以下文章, 使用資料庫正規化設計

    [說明資料庫正規化基本概念]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年10月23日 上午 03:41
  • 移文至 資料存取(ADO.NET與LINQ)
    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年10月23日 上午 03:45
  • 根據你的描述,我做了一個簡單的實驗,有興趣可以參考看看在調整成符合你真正需求的樣子。

    不過如同心冷大和Bill大所說,你不妨可以study一下有關SQL語法及資料庫正規劃方面,相信會有很大的助益。

    USE [Northwind]
    GO
    
    /****** Object:  Table [dbo].[Students]    Script Date: 10/23/2011 13:59:00 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[Students](
    	[StudentID] [tinyint] NOT NULL,
    	[Name] [nvarchar](5) NOT NULL,
     CONSTRAINT [PK_Students] PRIMARY KEY CLUSTERED 
    (
    	[StudentID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    
    USE [Northwind]
    GO
    
    /****** Object:  Table [dbo].[Subjects]    Script Date: 10/23/2011 13:59:26 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[Subjects](
    	[SubjectID] [tinyint] NOT NULL,
    	[Name] [nvarchar](5) NOT NULL,
     CONSTRAINT [PK_Subjects] PRIMARY KEY CLUSTERED 
    (
    	[SubjectID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    
    USE [Northwind]
    GO
    
    /****** Object:  Table [dbo].[Scores]    Script Date: 10/23/2011 13:59:48 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[Scores](
    	[SerialNo] [int] IDENTITY(1,1) NOT NULL,
    	[StudentID] [tinyint] NOT NULL,
    	[SubjectID] [tinyint] NOT NULL,
    	[Score] [tinyint] NOT NULL,
    	[UpdateDate] [datetime] NOT NULL,
     CONSTRAINT [PK_Scores] PRIMARY KEY CLUSTERED 
    (
    	[SerialNo] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    ALTER TABLE [dbo].[Scores]  WITH CHECK ADD  CONSTRAINT [FK_Scores_Students] FOREIGN KEY([StudentID])
    REFERENCES [dbo].[Students] ([StudentID])
    GO
    
    ALTER TABLE [dbo].[Scores] CHECK CONSTRAINT [FK_Scores_Students]
    GO
    
    ALTER TABLE [dbo].[Scores]  WITH CHECK ADD  CONSTRAINT [FK_Scores_Subjects] FOREIGN KEY([SubjectID])
    REFERENCES [dbo].[Subjects] ([SubjectID])
    GO
    
    ALTER TABLE [dbo].[Scores] CHECK CONSTRAINT [FK_Scores_Subjects]
    GO
    
    
    delete from dbo.Scores
    delete from dbo.Subjects
    delete from dbo.Students
    go
    
    --建立學生基本資料
    insert into dbo.Students(StudentID,Name) values(1,'林小明'),(2,'王OO')
    
    --建立考試科目資料
    insert into dbo.Subjects(SubjectID,Name) values (1,'國文'),(2,'英文'),(3,'數學'),(4,'物理')
    
    --建立成績資料
    insert into dbo.Scores(StudentID,SubjectID,Score,UpdateDate) values (1,1,50,'20111023'),(1,2,59,'20111023'),(1,3,89,'20111023'),(1,4,70,'20111023'),(2,1,80,'20111023'),(2,2,85,'20111023'),(2,3,25,'20111023'),(2,4,55,'20111023')
    
    --建立補考資料
    insert into dbo.Scores(StudentID,SubjectID,Score,UpdateDate) values (1,1,80,'20111024'),(1,1,90,'20111025'),(1,2,60,'20111024'),(2,3,100,'20111024'),(2,4,99,'20111026')
    
    select t2.Name as StudentName,t3.Name as SubjectName
    			,MIN(t1.score) as MinScore,MAX(t1.Score) as MaxScore
    from dbo.Scores t1
    inner join dbo.Students t2 
    	on t1.StudentID = t2.StudentID
    inner join dbo.Subjects t3
    	on t1.SubjectID = t3.SubjectID
    group by t2.Name,t3.Name
    order by StudentName,SubjectName	
    
    






    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    • 已提議為解答 Johnny.Net 2011年10月24日 下午 12:50
    • 已標示為解答 scolin 2011年10月25日 下午 12:53
    2011年10月23日 上午 06:01
  • 感謝各位先進提供解決方案
    其實是這樣的,我用了以下程式碼把資料庫某行放入VB.NET矩陣內和其他矩陣做分析
    Dim C() As Object = dt.Rows(0).ItemArray
    如果某一欄內有多筆資料,如這一欄內有二個E-MAIL(可以用程式決定要寄哪個帳號,也許是YAHOO或GMAIL)
    以前用EXCEL97-2003時,記得有某一個指令可以判斷逗號或分號後面內容的指令
    所以我在想,可不可以用Dim C() As Object = dt.Rows(0).ItemArray再加上SELECT或什麼指令
    即可直接挑出一個欄位內的最大或最小值?
    2011年10月23日 下午 01:27
  • 你確定你以前用的是 Excel ?

    就算在 Excel ,同一格 cell 裡面有兩個數字用逗號隔開,如果不是千位符號,就是字串,不可能在同一欄位挑一個最大或最小,必須在不同欄位才可以。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年10月23日 下午 02:38
  • 心冷熱情熄您好,我想以前不是用excel就是用access
    您說的很好,那一格欄位內該是字串,所以轉回程式內的矩陣時
    要想辨法把它轉成int才可以再做分析
    但是看目前各位先進的說法,我想是無法直接做判斷
    程式內是以整列做灰關聯分析,重新正規化會將欄位變得太多
    本來只有50列,現在變成200列,所以可能要另外想辨法了
    2011年10月23日 下午 11:58
  • ... 那一格欄位內該是字串...

    我想你這句應該並不是說你在資料庫裡面是以文字格式儲存考試分數吧?

    但是如果你目前的資料結構如下的話:

    姓名 

    國文 

    英文

    數學

    物理

    林小明

    59

    70

    89

    70

    林小明

    90

    70

    89

    70

    你並未註明每次考試是「月考」還是「補考」,也未考慮學生姓名重複的問題,也沒辦法很有彈性的增刪考試科目;我很懷疑你之後要如何進行進一步的處理。或許你的資料庫結構是應該好好重新整理一下才行。

    在你所述的情境中我並沒看出來有哪裡需要做「灰關聯」之處,似乎只是簡單的比較而已。但假設你目前的問題僅僅是希望得到資料庫中某人某科的最高或最低成績,你有試過使用 SQL 指令中的 MIN 和 MAX 函數嗎(可參考這一篇教學)?例如:

    SELECT MIN(Chinese) AS LowestScore_Chinese FROM tbl WHERE (Name = '林小明')

    取出這個 LowestScore_Chinese,再以相同方法另外取出數學最低分LowestScore_Math,就可以拿來運用了。



    ASP.NET 2Share - http://www.dotblogs.com.tw/johnny
    2011年10月24日 上午 03:48
  • 謝謝johnny.net
    此篇確實只需要做大小比較,使用min和max即可得到最高或最低成績
    灰關聯分析在於資訊不明確所做之分析,此篇未做灰色正規化和詳細解法
    為了簡易說明,希望能做到"判斷一個欄位之多筆資料",所以把問題寫得很簡單
    但我想這種方式應該是做不到,所以目前打算朝另一種方向去做
    最簡單的方法就是使用資料庫正規化,把原本50列的資料拆解成200列

    在此感謝所有前輩的幫忙

    2011年10月24日 下午 12:09
  • To: scolin

    就如同你所說的,你並沒有把你的情境明確的列出來,而只是列出你所簡化的情況而已;如果你的角色不是發問者而是回答者,你應該就能明瞭發問者在狀況不明的情形下,必須做很多的假設,而根據這些假設所建議的答案卻不一定最適合你所處的實際情境。

    在如你所述的情境中,我之所以建議你使用 SQL 既有的 MIN/MAX 函數,是因為我覺得那是解決你的問題的最快方法(我剛發現原來 Terry 早就這樣建議了),但那不是唯一的方法。如果你願意去學一下 LINQ 的話(你可以看一下這個範例),你應該也可以找到類似的方法可以使用。當然,應該採用哪一種方法,還是必須由你自已去評估。

     


    ASP.NET 2Share - http://www.dotblogs.com.tw/johnny
    • 已編輯 Johnny.Net 2011年10月24日 下午 12:43
    2011年10月24日 下午 12:30
  • 感謝所有前輩幫忙解答 ^ ^

    2011年10月25日 下午 12:54