假设我有一个表产品和一个表orders,它使用表“products”来指定每个订单中销售的产品。
现在我想做一个导出到Excel的报告,在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列为每一个新产品,非常可怕!
发布于 2014-12-04 11:57:39
这里有一个棘手的问题,我认为您应该尝试一种不同的方法,但要回答您的问题,我要说的是,您可以根据所需的条件,根据查询分组的结果动态创建"CREATE“语句。您需要创建group查询,为其创建一个游标,并创建一个循环来完成创建表的sql语句。获得语句后,可以使用"EXEC( @MySqlStatement )“创建表,其中@MySqlStatement是包含"CREATE”语句文本的变量。
之后,您可以使用相同的循环来使用数据来完成新表。
虽然我确信您可以使用这种方法使其工作,但我从未尝试过它,因为它所需的工作量和测试量很大。
您需要考虑的另一件事是,您将在何处将该脚本称为t脚本。如果您构建一个存储过程,它将是好的,但您不能使用excel中的存储过程(至少它不是直接的)。如果您构建了一个多语句表函数,它可能不允许您做某些事情,因为这类函数对于您可以在其中使用的t语言函数有一些限制。
如果您想考虑另一个选项,SSRS将是最好的,因为它可以根据结果集创建一个包含您需要的所有列的矩阵,基本上它可以为您完成所有的工作。此报表可导出到excel。
其他选项是使用当前的行类型创建一个更符合逻辑的结果集,并通过数据透视表、宏、.
希望这能有所帮助。
发布于 2018-08-16 15:25:12
您必须使用动态SQL。从获取产品数量的SELECT开始,然后使用该数字在动态查询中创建列列表。
https://stackoverflow.com/questions/27280909
复制相似问题