ExcelでSQLを使う-015: SQL ORDER BY 節 多重ソート
動物のお医者さん 第7章 |
鷹匠になることを夢見た小学生のハムテルは、ある日、道端で60円のひよこを買った。それはやがて、主人にまで蹴りをいれる恐るべきニワトリに成長した。いくたびかの苦難をを乗り越えて西根家にたどりついた気の強い仔猫は、そのままおばあさんにもらわれ、今では近所のパトロールに余念のない毎日である。アフリカでウイッチ・ドクターとして崇められていた篠原教授の威厳は、日本でも不動のままである。強いものはいくつになっても強いのだった。(同書の帯より)
◇◇◇◇◇
ORDER BY 節
前項までは、検索した行の並びには関心を払いませんでした。しかし、検索結果を並び替えることも SQL文の重要な役割りです。ORDER BY節を使うことで、SELECT節に指定した列のいずれかを基準として検索した行を特定の順序で並び替えるができます。
例えば、得意先台帳から<名前>と<読み>を抽出し<読み>の五十音順に並べることもできます。
SELECT 氏名,読み FROM [得意先台帳$A1:F11] ORDER BY 読み
本稿では、得意先台帳から<読み>昇順で抽出した<名前>を同じバイト数の文字列に左詰めして、かつ<読み>を付加してプリントするマクロを紹介します。
Sub Test()
Dim I As Integer
Dim N As Integer
Dim strSQL As String
Dim Customers() As String
Dim strName As String
Dim strYomi As String
strSQL = "SELECT 氏名,読み FROM [得意先台帳$A1:F11] ORDER BY 読み"
Customers() = Split(DSelect(strSQL), "|")
N = UBound(Customers) - 1
For I = 0 To N
strName = CutStr(Customers(I), ";", 2)
strYomi = CutStr(Customers(I), ";", 3)
Debug.Print SetL(strName, String(20, "-")) & strYomi
Next I
End Sub
' ==================
' 文字を左詰めする
' ==================
Public Function SetL(ByVal Text1 As String, ByVal Text2 As String) As String
Dim I As Integer
Dim J As Integer
Dim L As Integer
Dim M As Integer
Dim N As Integer
J = Len(Text1)
L = LenH(Text2)
For I = 1 To J
M = LenB(StrConv(Left(Text1, I), vbFromUnicode))
If M > L Then
SetL = Left(Text1, I - 1) & Left(Text2, L - N)
Exit Function
Else
N = M
End If
Next I
SetL = Text1 & Left(Text2, L - N)
End Function
' ==================
' 文字を右詰めする
' ==================
Public Function SetR(ByVal Text1 As String, ByVal Text2 As String) As String
Dim I As Integer
Dim J As Integer
Dim L As Integer
Dim M As Integer
Dim N As Integer
J = Len(Text1)
L = LenH(Text2)
For I = 1 To J
M = LenH(Mid$(Text1, 1, I))
If M > L Then
SetR = Left$(Text2, L - N) & Left$(Text1, I - 1)
Exit Function
Else
N = M
End If
Next I
SetR = Left$(Text2, L - N) & Text1
End Function
' =============================
' 文字列の長さをバイト数で返す
' =============================
Public Function LenH(ByVal Text As String) As Integer
LenH = LenB(StrConv(Text, vbFromUnicode))
End Function
多重ソート
ORDER BY 節に複数の列をカンマで区切って指定して、”多重ソート”することができます。次は、顧客情報を最初に<住所1>で並び替え、次に<読み>を基準に地区ごとのグループを並び替えます。
SELECT 名前, 読み, 住所1 [得意先台帳$A1:F11]
ORDER BY 住所1, 読み