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

时间:2014-12-03 20:22:34

标签: sql-server tsql sql-server-2012

假设我有一个表产品和一个表订单,它使用表'产品'来指定每个产品中出售的产品 顺序

现在我想要生成一个报告导出到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列,非常可怕!

2 个答案:

答案 0 :(得分:0)

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

之后,您可以使用相同的循环来实现包含数据的新表。

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

您需要考虑的另一件事是您将在何处调用该t-sql脚本。如果你构建一个存储过程,它会没问题,但你不能在excel中使用存储过程(至少它不是直接的)。如果你构建一个多语句表函数,可能它不允许你做某些事情,因为这些函数对你可以在其中使用的t-sql语言函数有一些限制。

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

其他选项是使用您当前拥有的行类型创建更符合逻辑的结果集,并通过数据透视表,宏,...转换该数据在Excel中...

希望这有帮助。

答案 1 :(得分:0)

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