如何将表寄存器转换为临时表的列



假设我有一个表格产品和一个表格订单,它使用表格"产品"来指定每个订单中销售的产品

现在我想制作一个报告以导出到 Excel,其中每个产品都在不同的列中,每个产品都有登记簿,计算已售出和需要销售的产品数量,每个卖家一个登记簿。

例:

产品:

 id | desc    | target_per_month
 -------------------------------
 1  | prepaid | 1000
 2  | pospaid | 500

订单:

 id | seller  | product_id | date
 --------------------------------------
 1  | clark   | 1          | 2014-12-11
 2  | kent    | 1          | 2014-12-10
 3  | kent    | 2          | 2014-12-11
 4  | kent    | 1          | 2014-12-10
 5  | clark   | 2          | 2014-12-09

我想要什么:

 seller | prepaid_sold | prepaid_target | prepaid_left | pospaid_sold | pospaid_target | pospaid_left 
 -------------------------------------------------------------------------------------------
 clark  | 1            | 1000           | 999          | 1            | 500            | 499
 kent   | 2            | 1000           | 998          | 1            | 500            | 499

如果我希望此表动态接受新产品,则select是什么样子的?现在的方式是为每个新产品手动放置 3 列,非常可怕!

你在这里有一个棘手的问题,我相信你应该尝试一种不同的方法,但为了回答你的问题,我想说你可以根据查询的结果动态创建"CREATE TABLE"语句,按你需要的术语分组。您需要按查询创建组,为其创建游标和一个循环以完成用于创建表的 sql 语句。获得语句后,您可以使用"EXEC(@MySqlStatement("创建表,其中@MySqlStatement是包含"CREATE TABLE"语句文本的变量。

之后,您可以使用相同的循环来使用数据完成新表。

虽然我相信你可以用这种方法让它工作,但我从未尝试过它,因为它需要大量的工作和测试。

您需要考虑的另一件事是您将在哪里调用该 t-sql 脚本。如果您构建存储过程,那很好,但不能在 excel 中使用存储过程(至少它不是直截了当的(。如果您构建一个多语句表函数,它可能不允许您执行某些操作,因为这些函数对您可以在其中使用的 t-sql languaje 函数有一些限制。

如果您想考虑其他选项,SSRS 将是最好的,因为它可以根据结果集创建一个包含所需所有列的矩阵,基本上它会为您完成所有工作。此报表可以导出到 excel。

另一种选择是使用您当前拥有的行类型创建一个更具逻辑性的 resulset,并通过数据透视表、宏在 excel 中转换该数据,...

希望这有帮助。

您必须使用动态 SQL。 从获取产品数量的 SELECT 开始,然后使用该数字在动态查询中创建列列表。

最新更新