我如何创建(临时?)存储过程来帮助制作摘要视图?

Posted

技术标签:

【中文标题】我如何创建(临时?)存储过程来帮助制作摘要视图?【英文标题】:how do i create a (temporary?) stored procedure to assist making a summary view? 【发布时间】:2011-04-26 22:41:11 【问题描述】:

我的视图表如下所示:

然后我开始创建一个视图来按每种货币的状态进行汇总:

WITH C AS (SELECT * FROM CampaignsPublisherReportSummary)
SELECT
    'Total' T,
    SUM(CASE WHEN PayCurrency='USD' THEN Total END) USD,
    SUM(CASE WHEN PayCurrency='EUR' THEN Total END) EUR,
    SUM(CASE WHEN PayCurrency='GBP' THEN Total END) GBP,
    SUM(CASE WHEN PayCurrency='AUD' THEN Total END) AUD
FROM C
UNION
SELECT
    'ToBePaid' T,
    SUM(CASE WHEN PayCurrency='USD' THEN ToBePaid END) USD,
    SUM(CASE WHEN PayCurrency='EUR' THEN ToBePaid END) EUR,
    SUM(CASE WHEN PayCurrency='GBP' THEN ToBePaid END) GBP,
    SUM(CASE WHEN PayCurrency='AUD' THEN ToBePaid END) AUD
FROM C
GO

我可以通过再次复制/粘贴每个其他状态(未验证、已验证、...等)来完成并获得我想要的,但是我的程序员希望拥有某种采用状态名称的函数并运行查询的模板化版本...

问题:我可以这样做吗?还是有其他更好的方法来分解我丢失的信息?

更新:我的目标是拥有这样的东西:

SELECT * FROM #mytempfunc('Total')
UNION SELECT * FROM #mytempfunc('ToBePaid')
UNION ...

【问题讨论】:

我不太确定你想做什么。您是否尝试动态生成货币列?如果是这样,您可以执行“从 [current_table] 中选择不同的支付货币”,执行游标/循环并动态构建汇总总/待支付金额的查询。 感谢您的反馈 - 也许我正试图让它变得复杂而不是它。无论如何,我确实更新了这个问题,并把当我“设想”作为这里的目标时...... 如果此查询的结果是在 s-s-rS 或类似中创建报告,则让报告工具处理分组和总计。 @Tony,感谢您的提示-您认为简单的报告在 s-s-rS 的学习曲线方面很容易获得吗?您知道基础知识的良好起点吗?我已经安装了它,但我从来没有启动过它——我最初与 SSIS 打交道让我很清醒,即作为一个 C# 程序员,由于缺乏人员,我试图接受一些 DBA 职责,有时我感觉就像一条鱼离开了水。 s-s-rS 并不难学,拿起一份“Microsoft SQL Server 2008 Reporting Services Step by Step”或“Professional Microsoft SQL Server 2008 Reporting Services”,您就可以开始使用了立刻。由于您已经为该工具付费,您不妨使用它。但是,请注意,s-s-rS 报告并非旨在直接在网站上显示而不会出现一些安全问题。希望未来的版本能够解决这个问题。 【参考方案1】:

我不完全清楚你在问什么;您需要动态 SQL 来按字符串值选择字段。但是,如果您的指标列表是静态的(并且应该是静态的,来自视图),您可以通过UNPIVOT 获得您需要的,或者至少更接近一点:

SELECT PayCurrency, Metric, Amount
FROM CampaignsPublisherReportSummary
UNPIVOT (Amount FOR Metric IN (Paid, ToBePaid, Total)) AS X

【讨论】:

很高兴为您提供帮助!请注意,上面的@Tony 可能是正确的,如果可能的话,您应该将透视和格式化留给您的报告层。不过,知道如何在数据库端处理它也很好。

以上是关于我如何创建(临时?)存储过程来帮助制作摘要视图?的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 数据库 (2010) 如何从查询设计器创建临时表/过程/视图

SQL 使用临时表创建视图

SQL-视图与存储过程

如果多个存储过程正在创建具有相同名称的临时表,我如何知道要删除哪个临时表?

如何在打开游标之前在存储过程中创建一个临时表?

如何临时转到另一个视图来创建实体