0

Excel シートにいくつかのデータがあり、それらのデータを Access に取得しようとしています。しかし、データは本当に悪い形です。これがエクセルの特徴です。

国、製品、ID、2010 年第 1 四半期フラッシュ、2010 年第 2 四半期フラッシュ、2010 年第 3 四半期フラッシュ、2010 年第 4 四半期フラッシュ、2011 年第 1 四半期予算など....

ご覧のとおり、これはデータを保存する非常に悪い方法です。このテーブルに対していくつかのクエリを実行したいのですが、新しい列が毎年追加されるため、現在のスキーマでは困難です。

以下のように、これらのデータを含む新しいテーブルをより適切な構造で作成する何らかの方法 (いくつかの SQL クエリである可能性があります) が必要です。

国、製品、ID、値、年、四半期、タイプ

あなたが私の主張を理解してくれることを願っています。AccessまたはExcelで誰かが私にいくつかの方法を提案できますか

4

1 に答える 1

0

求めるソリューションの一般的な形式は、次のような UNION クエリを使用することです。

SELECT [country], [product], [id],
    [1qtr 2010 flash] AS [Value],
    2010 AS [Year],
    1 AS [Qtr],
    "flash" AS [Type]
FROM ImportedTable
UNION ALL
SELECT [country], [product], [id],
    [2qtr 2010 flash] AS [Value],
    2010 AS [Year],
    2 AS [Qtr],
    "flash" AS [Type]
FROM ImportedTable
UNION ALL
SELECT [country], [product], [id],
    [3qtr 2010 flash] AS [Value],
    2010 AS [Year],
    3 AS [Qtr],
    "flash" AS [Type]
FROM ImportedTable
...

このようなクエリを [ReformatDataFromExcel] のような名前で保存すると、新しい列を持つ更新された Excel フィードをインポートするときに、必要に応じて新しい UNION ALL 句をコピーして貼り付けることでクエリを更新できます。

- 編集 -

または、コードを使用して SQL クエリ文字列を作成する場合は、次のような VBA を使用します...

Sub BuildQueries()
Dim cdb As DAO.Database, fld As DAO.Field, sSQL As String
Dim sYear As String, sQtr As String, sType As String, a() As String
Set cdb = CurrentDb
For Each fld In cdb.TableDefs("ImportedTable").Fields
    Select Case fld.Name
        Case "country", "product", "id"
            ' do nothing
        Case Else
            a = Split(fld.Name, " ", -1, vbBinaryCompare)
            sQtr = Left(a(0), 1)
            sYear = a(1)
            sType = a(2)
            sSQL = _
                    "SELECT [country], [product], [id], " & _
                    "[" & fld.Name & "] AS [Value], " & _
                    sYear & " AS [Year], " & _
                    sQtr & " AS [Qtr], " & _
                    """" & sType & """ AS [Type] " & _
                    "FROM ImportedTable"
            Debug.Print sSQL  ' or whatever you want to do with the query
    End Select
Next
Set fld = Nothing
Set cdb = Nothing
End Sub

...次のような SQL 文字列を作成できます。

SELECT [country], [product], [id], [1qtr 2010 flash] AS [Value], 2010 AS [Year], 1 AS [Qtr], "flash" AS [Type] FROM ImportedTable
SELECT [country], [product], [id], [2qtr 2010 flash] AS [Value], 2010 AS [Year], 2 AS [Qtr], "flash" AS [Type] FROM ImportedTable
SELECT [country], [product], [id], [3qtr 2010 flash] AS [Value], 2010 AS [Year], 3 AS [Qtr], "flash" AS [Type] FROM ImportedTable
SELECT [country], [product], [id], [4qtr 2010 flash] AS [Value], 2010 AS [Year], 4 AS [Qtr], "flash" AS [Type] FROM ImportedTable
SELECT [country], [product], [id], [1qtr 2011 budget] AS [Value], 2011 AS [Year], 1 AS [Qtr], "budget" AS [Type] FROM ImportedTable
SELECT [country], [product], [id], [2qtr 2011 budget] AS [Value], 2011 AS [Year], 2 AS [Qtr], "budget" AS [Type] FROM ImportedTable
SELECT [country], [product], [id], [3qtr 2011 budget] AS [Value], 2011 AS [Year], 3 AS [Qtr], "budget" AS [Type] FROM ImportedTable
SELECT [country], [product], [id], [4qtr 2011 budget] AS [Value], 2011 AS [Year], 4 AS [Qtr], "budget" AS [Type] FROM ImportedTable
于 2013-06-27T07:22:37.600 に答える