编写一个查询,将其结果与相同的结果进行比较,但另一个日期作为参考

时间:2016-08-01 16:04:10

标签: sql-server-2008 reporting

我有一个查询,将一个月的最终余额与同月的最终余额进行比较,但是从前一年算起。 查询工作正常,问题是当我想要检查超过2年之前,我的前任进行了查询但是这个查询花了太多时间来打印结果,它只是每年添加另一个查询我们想看,所以年份越高,查询越大。

另一位前任创建了一个数据透视表来查看结果以显示他的信息,仅显示3年前,查询本身是好的,但是当我们想要显示由于所有连接和联合而导致的整个信息时,查询变为时间效率低下。

该项目最近已传递给我,我看到原始(结构/主干)查询看起来不错,以达到与去年月度最终余额相比的月份最终余额的结果,但我希望更加动态的报告,无论我们正在研究的年/月,而不仅仅是完全硬编码或一遍又一遍地重复相同的查询。但我真的碰壁了,因为我无法想出如何让它以更动态的方式运作。我对报告和数据分析很新,这基本上限制了我的进步。

    SELECT T2.[Segment_0]+'-'+T2.[Segment_1]+'-'+T2.[Segment_2] Cuenta,
    T2.[AcctName], SUM(T0.[Debit]) Debito, SUM(T0.[Credit]) Credito, 
    SUM(T0.[Debit])-SUM(T0.[Credit]) Saldo
    FROM  [server].[DB1].[dbo].[JDT1] T0  
    INNER  JOIN [server].[DB1].[dbo].[OJDT] T1  
    ON  T1.[TransId] = T0.[TransId] 
    INNER JOIN [server].[DB1].[dbo].[oact] T2
    ON T2.[AcctCode] = T0.[Account]
    WHERE T0.[RefDate] >= '2007-12-31'  AND  T0.[RefDate] <= '2016-06-30'  
    GROUP BY T2.[Segment_0]+'-'+T2.[Segment_1]+'-'+T2.[Segment_2],T2.[AcctName]

我不是在寻找有人为我做这件事,而是为了能够指出我并指导我做出最佳行动的人来实现这一目标。

1 个答案:

答案 0 :(得分:0)

以下是一些建议:

  1. 我不清楚为什么你需要[server].[DB1].[dbo].[OJDT] T1。其数据不会显示在输出中,也不需要将T0加入T2。如果您可以省略它,请执行此操作。

    如果您因为需要从T0中排除T1以外的EXISTS中的事务而无法省略它,请使用T0子句而不是将其加入。

  2. 使用CTE按AccountT2条记录进行分组,然后将CTE加入T2。这样T0就不必加入; WITH Summed as ( SELECT Account , SUM(Credito) as SumCredito ... FROM [JDT1] T0 WHERE T0.[RefDate] >= ... GROUP BY Account ) SELECT (.. your composite segment field ..) , AccountName , SumCredito FROM Summed T1 JOIN [oact] T2 ON T1.account = T2.acctcode 中的每条记录,只需汇总结果即可。您也不需要按复合字段和帐户名进行分组,因为如果您在CTE中进行分组,则不会对它们进行分组。

    这是一个看起来像什么的概述:

    function urlDownload() {
      var dataImport = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('dataImport');
      var apiPoint = "http://www.fantasyfootballnerd.com/service/draft-projections/json/test/QB";
      var response = UrlFetchApp.fetch(apiPoint);
      var response_json = JSON.parse(response.getContentText()); 
      var length = response_json.DraftProjections.length
      var a = [];
      for(i=0; i<length; i++){
        dataImport.getRange(i+2, 1, 1, 1).setValue(response_json.DraftProjections[i].playerId)
        dataImport.getRange(i+2, 2, 1, 1).setValue(response_json.DraftProjections[i].completions)
        dataImport.getRange(i+2, 3, 1, 1).setValue(response_json.DraftProjections[i].attempts)
        dataImport.getRange(i+2, 4, 1, 1).setValue(response_json.DraftProjections[i].passingYards)
        dataImport.getRange(i+2, 5, 1, 1).setValue(response_json.DraftProjections[i].passingTD)
        dataImport.getRange(i+2, 6, 1, 1).setValue(response_json.DraftProjections[i].passingInt)
        dataImport.getRange(i+2, 7, 1, 1).setValue(response_json.DraftProjections[i].rushYards)
        dataImport.getRange(i+2, 8, 1, 1).setValue(response_json.DraftProjections[i].rushTD)
        dataImport.getRange(i+2, 9, 1, 1).setValue(response_json.DraftProjections[i].fantasyPoints)
        dataImport.getRange(i+2, 10, 1, 1).setValue(response_json.DraftProjections[i].displayName)
        dataImport.getRange(i+2, 11, 1, 1).setValue(response_json.DraftProjections[i].team)
    
      }
    }
    
  3. 如果您想要动态日期,您可能需要对其进行参数化并将其转换为存储过程(如果它还不是存储过程)。

  4. 尽可能多地推送格式化(包括将已经分组的数据从列表中旋转到矩阵中)到报告工具中。在T-SQL中实现动态旋转是棘手的,但在SSRS中只需要一个工具。
  5. 请记住,您始终可以在工具中动态设置列标题:您无需更改数据中的列名称。
  6. 希望这有帮助。