通过 odbc 在 SQLITE 上的电源查询中使用相关 table 中的计算列
Use computed columns in related table in power query on SQLITE via odbc
在power query(exel 2016, PC版本)中,是否可以引用相关table的计算列?
假设我有一个 sqlite 数据库如下
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE products (
iddb INTEGER NOT NULL,
px FLOAT,
PRIMARY KEY (iddb)
);
INSERT INTO "products" VALUES(0,0.0);
INSERT INTO "products" VALUES(1,1.1);
INSERT INTO "products" VALUES(2,2.2);
INSERT INTO "products" VALUES(3,3.3);
INSERT INTO "products" VALUES(4,4.4);
CREATE TABLE sales (
iddb INTEGER NOT NULL,
quantity INTEGER,
product_iddb INTEGER,
PRIMARY KEY (iddb),
FOREIGN KEY(product_iddb) REFERENCES products (iddb)
);
INSERT INTO "sales" VALUES(0,0,0);
INSERT INTO "sales" VALUES(1,1,1);
INSERT INTO "sales" VALUES(2,2,2);
INSERT INTO "sales" VALUES(3,3,3);
INSERT INTO "sales" VALUES(4,4,4);
INSERT INTO "sales" VALUES(5,5,0);
INSERT INTO "sales" VALUES(6,6,1);
INSERT INTO "sales" VALUES(7,7,2);
INSERT INTO "sales" VALUES(8,8,3);
INSERT INTO "sales" VALUES(9,9,4);
COMMIT;
基本上我们有产品 (iddb, px) 和这些产品的销售额 (iddb, quantity, product_iddb)
我通过以下方式在电源查询中加载此数据:
一个。使用 SQLITE3 驱动程序创建 ODBC 数据源:testDSN
乙。在 excel 中:数据/新查询,提供此连接字符串 Provider=MSDASQL.1;Persist Security Info=False;DSN=testDSN;
现在在 power 查询中,我添加了一个计算列,比如 px10 = px * 10
到产品 table。
在销售 table 中,我可以将 product
table 扩展为 product.px
,但不能扩展 product.px10
。它不应该可行吗? (在这个简化的示例中,我可以先展开 product.px,然后在销售 table 中创建 px10 列,但是随后任何新的 table 需要产品中的 px10 都需要我重复该工作。 ..)
感谢任何意见。
在函数式编程中,您不会修改现有值,只会创建新值。当您将新列添加到 product
时,它会创建一个新的 table,并且不会修改显示在相关 table 中的 product
table。在 product
上添加新列不会显示在 Odbc 的 table 中,除非您将该转换应用于所有相关的 table。
你可以做的是将 "add a computed column" 概括为一个函数,该函数接受 table 或记录并添加额外的字段。然后将其应用于数据库中的每个 table。
这是在 SQL 服务器
中针对 Northwind 的示例
let
Source = Sql.Database(".", "Northwind_Copy"),
AddAColumn = (data) => if data is table then Table.AddColumn(data, "UnitPrice10x", each [UnitPrice] * 10)
else if data is record then Record.AddField(data, "UnitPrice10x", data[UnitPrice] * 10)
else data,
TransformedSource = Table.TransformColumns(Source, {"Data", (data) => if data is table then Table.TransformColumns(data, {"Products", AddAColumn}, null, MissingField.Ignore) else data}),
OrderDetails = TransformedSource{[Schema="dbo",Item="Order Details"]}[Data],
#"Expanded Products" = Table.ExpandRecordColumn(OrderDetails, "Products", {"UnitPrice", "UnitPrice10x"}, {"Products.UnitPrice", "Products.UnitPrice10x"})
in
#"Expanded Products"
我将从销售查询中添加一个合并步骤以将其连接到产品查询(其中将包括您的计算列)。然后我将展开返回的 Table 以获得您的 px10 列。
这不是扩展表示产品 SQL table 的值列,它是使用 SQL 外键生成的。
您将不得不返回并将添加到产品查询的任何其他列添加到扩展列表,但至少列定义只在一个地方。
在power query(exel 2016, PC版本)中,是否可以引用相关table的计算列?
假设我有一个 sqlite 数据库如下
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE products (
iddb INTEGER NOT NULL,
px FLOAT,
PRIMARY KEY (iddb)
);
INSERT INTO "products" VALUES(0,0.0);
INSERT INTO "products" VALUES(1,1.1);
INSERT INTO "products" VALUES(2,2.2);
INSERT INTO "products" VALUES(3,3.3);
INSERT INTO "products" VALUES(4,4.4);
CREATE TABLE sales (
iddb INTEGER NOT NULL,
quantity INTEGER,
product_iddb INTEGER,
PRIMARY KEY (iddb),
FOREIGN KEY(product_iddb) REFERENCES products (iddb)
);
INSERT INTO "sales" VALUES(0,0,0);
INSERT INTO "sales" VALUES(1,1,1);
INSERT INTO "sales" VALUES(2,2,2);
INSERT INTO "sales" VALUES(3,3,3);
INSERT INTO "sales" VALUES(4,4,4);
INSERT INTO "sales" VALUES(5,5,0);
INSERT INTO "sales" VALUES(6,6,1);
INSERT INTO "sales" VALUES(7,7,2);
INSERT INTO "sales" VALUES(8,8,3);
INSERT INTO "sales" VALUES(9,9,4);
COMMIT;
基本上我们有产品 (iddb, px) 和这些产品的销售额 (iddb, quantity, product_iddb)
我通过以下方式在电源查询中加载此数据:
一个。使用 SQLITE3 驱动程序创建 ODBC 数据源:testDSN
乙。在 excel 中:数据/新查询,提供此连接字符串 Provider=MSDASQL.1;Persist Security Info=False;DSN=testDSN;
现在在 power 查询中,我添加了一个计算列,比如 px10 = px * 10
到产品 table。
在销售 table 中,我可以将 product
table 扩展为 product.px
,但不能扩展 product.px10
。它不应该可行吗? (在这个简化的示例中,我可以先展开 product.px,然后在销售 table 中创建 px10 列,但是随后任何新的 table 需要产品中的 px10 都需要我重复该工作。 ..)
感谢任何意见。
在函数式编程中,您不会修改现有值,只会创建新值。当您将新列添加到 product
时,它会创建一个新的 table,并且不会修改显示在相关 table 中的 product
table。在 product
上添加新列不会显示在 Odbc 的 table 中,除非您将该转换应用于所有相关的 table。
你可以做的是将 "add a computed column" 概括为一个函数,该函数接受 table 或记录并添加额外的字段。然后将其应用于数据库中的每个 table。
这是在 SQL 服务器
中针对 Northwind 的示例let
Source = Sql.Database(".", "Northwind_Copy"),
AddAColumn = (data) => if data is table then Table.AddColumn(data, "UnitPrice10x", each [UnitPrice] * 10)
else if data is record then Record.AddField(data, "UnitPrice10x", data[UnitPrice] * 10)
else data,
TransformedSource = Table.TransformColumns(Source, {"Data", (data) => if data is table then Table.TransformColumns(data, {"Products", AddAColumn}, null, MissingField.Ignore) else data}),
OrderDetails = TransformedSource{[Schema="dbo",Item="Order Details"]}[Data],
#"Expanded Products" = Table.ExpandRecordColumn(OrderDetails, "Products", {"UnitPrice", "UnitPrice10x"}, {"Products.UnitPrice", "Products.UnitPrice10x"})
in
#"Expanded Products"
我将从销售查询中添加一个合并步骤以将其连接到产品查询(其中将包括您的计算列)。然后我将展开返回的 Table 以获得您的 px10 列。
这不是扩展表示产品 SQL table 的值列,它是使用 SQL 外键生成的。
您将不得不返回并将添加到产品查询的任何其他列添加到扩展列表,但至少列定义只在一个地方。