使用 VBA Excel 的 SQL 数据透视函数文本文件数据库

2023-12-08

我们在工作中无法访问 SQL Server,因此我必须在 Excel VBA 中设计一个应用程序并使用文本文件 (CSV) 来存储数据。

我查询数据、加入 CSV 没有问题,但我想使用 SQL Pivot/Unpivot 语句将其中一列转置为行。我不确定该功能是否存在,因为我不断收到 FROM 子句中存在语法错误的错误。

    Public Function getData() As ADODB.Recordset

    Dim path As String, conn As ADODB.Connection, rs As ADODB.Recordset
    path = ThisWorkbook.path & "\"

    Set conn = New ADODB.Connection
    Set rs = New ADODB.Recordset

    conn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;" & _
               "Data Source=" & path & ";" & _
               "Extended Properties=""text; HDR=Yes; FMT=Delimited; IMEX=1;""")

    rs.ActiveConnection = conn
    rs.Source = "SELECT * " & _
                "FROM " & _
                    "(SELECT emp_id, client, allocation " & _
                    "FROM ALLOCATIONdb.csv) AS s " & _
                "PIVOT (SUM(allocation) FOR client IN (client1, client2)) AS pvt"

    Set getData = rs

End Function

我的数据目前看起来像图片的顶部,我希望它看起来像底部。

这对于数据透视表来说很简单,但我希望用户能够输入数据。

此外,是否有办法使其动态化,因为可能的客户端数量未知,因此行数需要扩展。

提前致谢


这可能不是最好的解决方案,但它确实对我有用。 我将数据转换为列表,并将其传递给名为“ToDataTable”的函数,以首先转换为数据表。

public  DataTable ToDataTable<T>(List<T> items)
        {
            DataTable dataTable = new DataTable(typeof(T).Name);
            PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
            foreach (PropertyInfo prop in Props)
            {
                dataTable.Columns.Add(prop.Name , prop.PropertyType);
            }
            foreach (T item in items)
            {
                var values = new object[Props.Length];
                for (int i = 0; i < Props.Length; i++)
                {
                    object val;
                    val = Props[i].GetValue(item, null);
                    values[i] = val;
                }
                dataTable.Rows.Add(values);
            }
            return dataTable;
        }

然后使用 GetInversedDataTable() 函数将其转换为您想要的格式。

public static DataTable GetInversedDataTable(DataTable table, string columnX, 
     string columnY, string columnZ, string nullValue, bool sumValues)
{

    DataTable returnTable = new DataTable();

    if (columnX == "")
        columnX = table.Columns[0].ColumnName;

    returnTable.Columns.Add(columnY);
    List<string> columnXValues = new List<string>();

    foreach (DataRow dr in table.Rows)
    {

        string columnXTemp = dr[columnX].ToString();
        if (!columnXValues.Contains(columnXTemp))
        {

            returnTable.Columns.Add(columnXTemp);
        }
    }

    //Verify if Y and Z Axis columns re provided
    if (columnY != "" && columnZ != "")
    {

        List<string> columnYValues = new List<string>();

        foreach (DataRow dr in table.Rows)
        {
            if (!columnYValues.Contains(dr[columnY].ToString()))
                columnYValues.Add(dr[columnY].ToString());
        }

        //Loop all Column Y Distinct Value
        foreach (string columnYValue in columnYValues)
        {

            DataRow drReturn = returnTable.NewRow();
            drReturn[0] = columnYValue;
            DataRow[] rows = table.Select(columnY + "='" + columnYValue + "'");

            foreach (DataRow dr in rows)
            {
                string rowColumnTitle = dr[columnX].ToString();

                foreach (DataColumn dc in returnTable.Columns)
                {
                    if (dc.ColumnName == rowColumnTitle)
                    {

                        if (sumValues)
                        {
                            try
                            {
                                drReturn[rowColumnTitle] = 
                                     Convert.ToDecimal(drReturn[rowColumnTitle]) + 
                                     Convert.ToDecimal(dr[columnZ]);
                            }
                            catch
                            {
                                drReturn[rowColumnTitle] = dr[columnZ];
                            }
                        }
                        else
                        {
                            drReturn[rowColumnTitle] = dr[columnZ];
                        }
                    }
                }
            }
            returnTable.Rows.Add(drReturn);
        }
    }
    else
    {
        throw new Exception("The columns to perform inversion are not provided");
    }
    if (nullValue != "")
    {
        foreach (DataRow dr in returnTable.Rows)
        {
            foreach (DataColumn dc in returnTable.Columns)
            {
                if (dr[dc.ColumnName].ToString() == "")
                    dr[dc.ColumnName] = nullValue;
            }
        }
    }

    return returnTable;
}

像这样使用它:

DataTable dtReturn = GetInversedDataTable(dt, "client", "emp_id", 
                                          "allocation", "0", true);

提供了三列并返回一个新的 DataTable。

下面的示例将使用源表和下面的参数来构建数据透视表。 就你而言: X 轴列:“客户端” Y 轴列:“emp_id” Z轴栏:“分配” 空值:“0”; 值总和:true

请注意,这是我用于解决我的问题的代码,并且我的代码是 C# 语言

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 VBA Excel 的 SQL 数据透视函数文本文件数据库 的相关文章

  • Excel 数字缩写格式

    这是我想要完成的任务 Value Display 1 1 11 11 111 111 1111 1 11k 11111 11 11k 111111 111 11k 1111111 1 11M 11111111 11 11M 11111111
  • 两个日期之间的小时数在 Excel 中不起作用

    根据要求 我提供了一张简化的屏幕截图来说明该问题 如您所见 我减去了两个日期并将其格式化为 h mm ss 为什么这不能提供两个日期之间经过的总小时数 有一个更好的方法吗 下面有一个很好的答案 但我试图弄清楚为什么按照此屏幕截图中所示的方式
  • 是否有适用于所有数据库的标准sql

    如下所示 不同数据库的语法有所不同 是否存在适用于所有数据库的标准方法 有没有什么工具可以将任意sql转换为任意sql SQL Server 2005 CREATE TABLE Table01 Field01 int primary key
  • 使用输入作为显示日期的基础

    我需要一种方法来使用用户窗体上的输入来确定将在输出上显示的日期 这是我的代码 If StatusBox Value lt 23 59 And ShiftCode Value AP Then Cells emptyRow 8 Value Da
  • 在 SQL 数据库中存储“列表”的最正确方法是什么?

    因此 我读了很多关于如何将多个值存储到一个列中是一个坏主意 并且违反了数据标准化的第一条规则 令人惊讶的是 这不是 不要谈论数据标准化 所以我需要一些帮助 目前我正在为我工 作的地方设计一个 ASP NET 网页 我想根据此人所属的 Act
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int
  • 我如何以更好的方式编码而不是像这样的VBA编码

    我正在 Excel 中创建一个仪表板 但是我想知道是否有比这更好的编码方式 我想对其进行模块化 而不是这样做以使其更加整洁 Private Sub Afford If af Value True Then af afr Value Shee
  • 获取当前 VBA 函数的名称

    对于错误处理代码 我想获取发生错误的当前 VBA 函数 或子函数 的名称 有谁知道如何做到这一点 编辑 谢谢大家 我曾希望存在一个未记录的技巧来自行确定函数 但这显然不存在 我想我会保留当前的代码 Option Compare Databa
  • 用更轻的解决方案替换完整的 ORM(JPA/Hibernate):推荐的加载/保存模式?

    我正在开发一个新的 Java Web 应用程序 并且正在探索保存数据的新方法 对我来说是新方法 我主要有 JPA 和 Hibernate 的经验 但是 除了简单的情况之外 我认为这种完整的 ORM 可能会变得相当复杂 另外 我不太喜欢和他们
  • 有没有更快的方法来使用Powershell解析Excel文档?

    我正在与一个接口MS Excel文件通过Powershell 每个 Excel 文档可能有大约 1000 行数据 目前这个脚本似乎读取了Excel文件并以每 0 6 秒 1 条记录的速率将值写入屏幕 乍一看 这似乎非常慢 这是我第一次阅读E
  • MySQL 查询到 CSV [重复]

    这个问题在这里已经有答案了 有没有一种简单的方法来运行MySQL查询来自linux命令行并以csv格式输出结果 这就是我现在正在做的事情 mysql u uid ppwd D dbname lt lt EOQ sed e s g tee l
  • 在 Excel 中使用 VBA 设置图像透明度

    有没有办法使用 VBA 脚本对图像应用一些透明度 我录制了一个 宏 但似乎没有录制艺术效果 我已经找到了如何制作形状 但没有找到图像 这需要几个步骤 将自选图形 如矩形 放置在工作表上 使用以下方法将您的实际图片嵌入矩形中 ShapeRan
  • SELECT 语句会受到 SQL 注入攻击吗?

    实际上有2个问题 我知道我必须尽可能多地使用存储过程 但我想知道以下内容 A 我可以从 SELECT 语句 例如 Select from MyTable 获得 SQL 注入攻击吗 B 另外 当我在 ASP NET 中使用 SQLDataSo
  • 为什么我可以像调用实例方法一样调用类方法?

    我正在查看这个例子 class SQLObject def self columns return columns if columns columns DBConnection execute2 lt lt SQL first SELEC
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • XML 解析:格式良好的检查:未声明的实体

    我正在使用 SSMS 2008 但收到以下错误 你知道这意味着什么吗 Msg 9448 Level 16 State 1 Line 4 XML parsing line 1 character 89 well formed check un
  • 使用 VBScript 在日期字段值上选择错误的数据

    我有一张包含以下数据的表 现在 Excel 共有 36 个任务 每个任务有 4 列 第一个任务 即 Task1 名称将始终从 L 列开始 144 列描述了 36 个任务 现在我们需要按行进行检查 并需要检查 TNStart 开始日期 你们能
  • 如何使用 LAMBDA 表达式在 LINQ 中执行 IN 或 CONTAINS?

    我有以下 Transact Sql 我正在尝试将其转换为 LINQ 并且很挣扎 SELECT FROM Project WHERE Project ProjectId IN SELECT ProjectId FROM ProjectMemb
  • 将 MS 转换为秒

    我发现这个公式可以用来将 MS 转换为秒 但它是为 Excel 2002 编写的 而我正在使用 2010 CONCATENATE TEXT INT B1 1000 86400 hh mm ss B1 INT B1 1000 1000 以下是
  • 使用 postgres 和 node js 在单个语句中执行多个查询

    我需要在像这样的单个语句中执行插入和删除查询 INSERT INTO COMPANY ID NAME VALUES 1 Paul DELETE FROM COMPANY WHERE ID 12 这是我用于执行查询的 node js 代码 p

随机推荐

  • 如何在 BitmapFactory 中保持图像质量相同

    我已将位图图像转换为字符串以保存它 Bitmap photo extras getParcelable data ByteArrayOutputStream baos new ByteArrayOutputStream photo comp
  • 将许多子目录拆分为一个新的、单独的 Git 存储库

    这个问题与 将许多子目录分离到新的单独的 git 存储库中 Git 子树和多个目录 我不想分离单个子目录 而是想分离几个子目录 例如 这是我的文件夹结构 app1 file1 file2 folder1 folder2 app2 file3
  • 来自输入文件的动态数组

    我是初学者 所以如果这确实是一个愚蠢的问题 我很抱歉 我的任务是从输入文件中打印出动态数组 我尝试用谷歌搜索它 发现了一些类似的问题 但答案都是 使用向量 等 但我们还没有学到这些 还说必须使用函数 这就是我想出的 include
  • 如何从 PL/pgSQL 写入磁盘上的文件?

    我想做相当于 c 或 php fopen 和 fwrite 的操作 我不想将表转储到磁盘 我正在尝试在开发过程中进行一些调试日志记录 您可以在 postgres 函数中使用 plpythonu f open f write f close
  • Bootstrap 下拉菜单隐藏在模式中

    您好 我正在尝试获取引导下拉列表以显示模型内的列表 我想我要说的是 当我单击下拉菜单时 它会展开 但如果列表比模型长 它将切断列表的其余部分 导致用户无法选择所有选项 我一直在谷歌搜索并看到这篇文章点击这里这与我的问题非常相似 然而 他们说
  • Pandas 使用正则表达式分隔符读取 csv

    我一直在尝试读取这样的自定义 csv 文件 6 Rotterdam NLD Zuid Holland 593321 19 Zaanstad NLD Noord Holland 135621 214 Porto Alegre BRA Rio
  • java 类型推断是如何工作的?

    有人可以解释一下以下语法是如何工作的吗 public static
  • 有关 PHP 中网络爬虫的错误

    我正在尝试使用 PHP 创建一个简单的网络爬虫 它能够爬行 edu 域 并提供父级的种子 url 我使用了简单的html dom来实现爬虫 而一些核心逻辑是我自己实现的 我将发布下面的代码并尝试解释这些问题 private function
  • ios 在“确认您的应用内购买”对话框中显示不同的价格

    为 iOS 应用添加应用内购买 我可以成功购买该产品 但 确认您的应用内购买 对话框始终显示与我格式化的本地化价格相比的额外价格 示例 产品的本地化价格为 39 99 欧元 但在确认对话框中 产品的价格增加到 41 73 欧元 预先感谢您提
  • Maven的pom.xml中的pluginManagement是什么?

    这是我的 pom 文件的一个片段
  • 分区:如何在每个分区后添加等待

    我有一个每分钟接受 20 个请求的 API 之后我需要等待 1 分钟才能查询它 我有一个项目列表 通常超过 1000 个 我需要从 API 查询其详细信息 我的想法是我可以使用Partitioner将我的列表分为 20 个项目 请求 但很快
  • jquery foreach div 随机颜色

    我的函数有这个问题 我试图将一些颜色 预定义 随机化到我的 div 中 并在每次使用颜色时进行计数 这是我的html div class change color2 div div class change color2 div div c
  • mysql中为什么null<>null=null

    我正在学习 MySql 教程 并且完成了以下查询 mysql gt select null lt gt null null lt gt null NULL 我不明白为什么结果是 Null 我认为它需要是 1 或 0 基于其他比较运算符的结果
  • Aws Api Gateway 集成请求 如何将属性附加到请求正文?

    我想在将请求正文和查询字符串参数发送到 lambda 之前将其组合起来 假设我在 Lambda 中有一个实体 如下所示 Class Person private String firstName private String lastNam
  • 在 Pandas 中创建空数据框并指定列类型

    我正在尝试创建一个带有索引的空数据框并指定列类型 我这样做的方式如下 df pd DataFrame index pbp columns contract state and county code state county startin
  • Android:SDK和库项目有什么区别

    对于像facebook这样的应用程序 他们提供了SDK 我使用了许多第三方库来满足不同的需求 这两种情况有什么区别 这是作为库或 sdk 捆绑的代码 A Library是一段代码 您可以从自己的代码中调用它 以帮助您更快 更轻松地完成任务
  • 我可以让Shiny在更新之前等待numericInput更长的时间吗?

    在我的 Shiny 应用程序中 有一些numericInput and selectInput Shiny 在键入期间更新输出 尤其是当用户在 numericInput 中键入速度较慢时 sumbitButton你能习惯停止自动更新吗 但我
  • 实体框架:当数据库更改时如何刷新模型?

    如果您从数据库构建 edmx 文件 然后数据库发生更改 如何让模型接受更改 您是否删除整个模型并重新生成 或者您可以检测到更改吗 我看到一篇文章提到 更新您的模型 rt edmx 文件上的鼠标命令 但我没有看到它 更新您的 edmx 以反映
  • com.google.firebase.FirebaseException:发生内部错误。 [7:]

    我曾经创建帐户并使用 firebase 连接到我的应用程序 但很快当我断开连接时 我无法创建帐户 1 小时后 我设法创建了一个帐户 当我断开连接以查看问题是否解决时 我意识到它仍然存在 通过做task getException 如果帐户创建
  • 使用 VBA Excel 的 SQL 数据透视函数文本文件数据库

    我们在工作中无法访问 SQL Server 因此我必须在 Excel VBA 中设计一个应用程序并使用文本文件 CSV 来存储数据 我查询数据 加入 CSV 没有问题 但我想使用 SQL Pivot Unpivot 语句将其中一列转置为行