假设我有一个表格产品和一个表格订单,它使用表格"产品"来指定每个订单中销售的产品。
现在我想制作一个报告以导出到 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 开始,然后使用该数字在动态查询中创建列列表。