簡體   English   中英

SQL:如何查詢所有列的不同值

[英]SQL: How to query the distinct values for all columns

例如,表具有3行3列:

名字年齡性別
彼得25 M
約翰29 M
亞歷克斯25 M

我想查詢表並獲取

名字年齡性別
彼得25 M
約翰29
亞歷克斯

我嘗試過的方法:

SELECT DISTINCT Name,Age,Gender FROM table

輸出仍然是

名字年齡性別
彼得25 M
約翰29 M
亞歷克斯25 M

如何實現每個字段沒有多余條目的表? 謝謝。

感謝大家的幫助,尤其是donPablo的幫助。 這是我實現該目標的VBA代碼。 由於我是VBA的新手,因此代碼可能不是很干凈和有效。 但至少它能起作用。

Option Compare Database

Sub ReadDistinctValue()

Dim d As Database
Dim rs As Recordset
Dim FN As Field, Age As Field, Sex As Field

Set d = CurrentDb()
Set rs = d.OpenRecordset("Table1")
Set FN = rs.Fields("FN")
Set Age = rs.Fields("Age")
Set Sex = rs.Fields("Sex")

d.Execute "CREATE TABLE Table4 (FN Text,Age Text,Sex Text)"

While Not rs.EOF
    If CheckFN(FN) = False Then
        Call WriteFN(FN)
    End If
    If CheckAge(Age) = False Then
        Call WriteAge(Age)
    End If
    If CheckSex(Sex) = False Then
        Call WriteSex(Sex)
    End If
    rs.MoveNext
Wend

rs.Close

End Sub

Function CheckFN(FN As Field) As Boolean

Dim d As Database
Dim rs_new As Recordset
Dim FN_new As Field

Set d = CurrentDb()
Set rs_new = d.OpenRecordset("Table4")
Set FN_new = rs_new.Fields("FN")

CheckFN = False

Do While Not rs_new.EOF
    If FN_new = FN Then
        CheckFN = True
        Exit Do
    End If
    rs_new.MoveNext
Loop

rs_new.Close

End Function

Function WriteFN(FN As Field)
Dim d As Database
Dim rs_new As Recordset
Dim FN_new As Field

Set d = CurrentDb()
Set rs_new = d.OpenRecordset("Table4")
Set FN_new = rs_new.Fields("FN")

If Not rs_new.EOF Then
    rs_new.MoveFirst
End If

Do While True
    If rs_new.EOF Then
        rs_new.AddNew
        FN_new = FN
        rs_new.Update
        Exit Do
    End If
    If IsNull(FN_new.Value) Then
        rs_new.Edit
        FN_new = FN
        rs_new.Update
        Exit Do
    End If
    rs_new.MoveNext
Loop
rs_new.Close
End Function

Function CheckAge(Age As Field) As Boolean

Dim d As Database
Dim rs_new As Recordset
Dim Age_new As Field

Set d = CurrentDb()
Set rs_new = d.OpenRecordset("Table4")
Set Age_new = rs_new.Fields("Age")

CheckAge = False

Do While Not rs_new.EOF
    If Age_new = Age Then
        CheckAge = True
        Exit Do
    End If
    rs_new.MoveNext
Loop

rs_new.Close

End Function

Function WriteAge(Age As Field)
Dim d As Database
Dim rs_new As Recordset
Dim Age_new As Field

Set d = CurrentDb()
Set rs_new = d.OpenRecordset("Table4")
Set Age_new = rs_new.Fields("Age")

If Not rs_new.EOF Then
    rs_new.MoveFirst
End If

Do While True
    If rs_new.EOF Then
        rs_new.AddNew
        Age_new = Age
        rs_new.Update
        Exit Do
    End If
    If IsNull(Age_new.Value) Then
        rs_new.Edit
        Age_new = Age
        rs_new.Update
        Exit Do
    End If
    rs_new.MoveNext
Loop
rs_new.Close
End Function

Function CheckSex(Sex As Field) As Boolean

Dim d As Database
Dim rs_new As Recordset
Dim Sex_new As Field

Set d = CurrentDb()
Set rs_new = d.OpenRecordset("Table4")
Set Sex_new = rs_new.Fields("Sex")

CheckSex = False

Do While Not rs_new.EOF
    If Sex_new = Sex Then
        CheckSex = True
        Exit Do
    End If
    rs_new.MoveNext
Loop

rs_new.Close

End Function

Function WriteSex(Sex As Field)
Dim d As Database
Dim rs_new As Recordset
Dim Sex_new As Field

Set d = CurrentDb()
Set rs_new = d.OpenRecordset("Table4")
Set Sex_new = rs_new.Fields("Sex")

If Not rs_new.EOF Then
    rs_new.MoveFirst
End If

Do While True
    If rs_new.EOF Then
        rs_new.AddNew
        Sex_new = Sex
        rs_new.Update
        Exit Do
    End If
    If IsNull(Sex_new.Value) Then
        rs_new.Edit
        Sex_new = Sex
        rs_new.Update
        Exit Do
    End If
    rs_new.MoveNext
Loop
rs_new.Close
End Function

通過命名三列,您將檢索該組值的不同組合。

如果要使用不同值的列表,請在選擇項中分別命名。

SELECT DISTINCT Name FROM table

SELECT DISTINCT Age FROM table

SELECT DISTINCT Gender FROM table

如果您試圖使它們像您的示例一樣顯示,則必須通過某些GUI功能來實現。 SQL數據庫引擎不擅長顯示技巧,僅處理數據。

我稍微擴展了表值,只是為了看看會發生什么-

FN      Age Sex
Alice   28  F
Ben     19  M
Charles 33  M
Doug    23  M
Elaine  21  F
Frank   25  M
Gwen    28  F
Helen   33  F
Alice   17  F
Ben     21  F

然后,我為FN開發了一個查詢,后來又推廣到了所有三個領域-

線索是對每個FN / AGE / SEX進行#排序,然后加入該seq#-

SELECT 
   AB.fn,
   CD.age,
   EF.sex

FROM   
((SELECT A.fn, Count(B.fn) AS CNTfn
    FROM   
    (SELECT DISTINCT fn FROM   table1) AS A,
    (SELECT DISTINCT fn FROM   table1) AS B
    WHERE  B.fn <= A.fn
    GROUP  BY A.fn) AS AB

LEFT JOIN 
 (SELECT C.age, Count(D.age) AS CNTage
    FROM   
    (SELECT DISTINCT age FROM   table1) AS C,
    (SELECT DISTINCT age FROM   table1) AS D
    WHERE  D.age <= C.age
    GROUP  BY C.age) AS CD
ON AB.cntfn = CD.cntage)

LEFT JOIN 
 (SELECT E.sex, Count(F.sex) AS CNTsex
    FROM   
    (SELECT DISTINCT sex FROM   table1) AS E,
    (SELECT DISTINCT sex FROM   table1) AS F
    WHERE  F.sex <= E.sex
    GROUP  BY E.sex) AS EF
ON AB.cntfn = EF.CNTsex;

這給出了所需的結果-

FN  AGE SEX
Alice   17  F
Ben     19  M
Charles 21  
Doug    23  
Elaine  25  
Frank   28  
Gwen    33  
Helen       

我更改了示例表中的性別,並添加到以下內容中,作為不分明的整個表的第一個順序,並將ON ...更改為XZ.cntall ...

(SELECT X.FN & X.AGE & X.SEX, Count(*) AS CNTall
FROM   
(SELECT DISTINCT FN, AGE,  SEX FROM   table1) AS X,
(SELECT DISTINCT FN, AGE,  SEX FROM   table1) AS Z
WHERE  Z.FN & Z.AGE & Z.SEX <= X.FN & X.AGE & X.SEX
GROUP  BY X.FN,  X.AGE,  X.SEX) as XZ

現在得到這些結果

fn     age  sex
Alice   17  M
Ben     19  N
Charles 21  O
Doug    23  P
Elaine  25  Q
Frank   28  R
Gwen    33  W
Helen       X
            Y
            Z

為此可能有一個SQL解決方案。 我對能做什么感到驚訝。 但是,我的回答是,這是VBA的完美應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM