0

我在 excel 表中有一些数据,我正在尝试将这些数据获取到 Access。但是数据真的很糟糕。这就是excel所具有的。

国家、产品、ID、2010 年 1 季度闪存、2010 年 2 季度闪存、2010 年 3 季度闪存、2010 年 4 季度闪存、2011 年 1 季度预算等....

现在您可以看到,这是一种非常糟糕的数据存储方式。我想在这个表上运行一些查询,但是对于当前模式来说这很困难,因为每年都会添加新列。

我想要某种方式(可能是一些 sql 查询),它将创建一个具有更好结构的这些数据的新表,如下所示

国家, 产品, id, 值, 年, Qtr, 类型

希望你明白我的意思。任何人都可以在 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 回答