首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简化查询以用作winform rdlc报表中的数据集

简化查询以用作winform rdlc报表中的数据集
EN

Stack Overflow用户
提问于 2018-10-30 05:34:47
回答 1查看 191关注 0票数 0

我正在尝试让这个查询在我正在构建的winform应用程序中填充一个reportviewer (并将查询中的参数更改为在填充要查看的报表之前在表单上选择的值)。但过盈功能无法发挥作用。用户将从无线电框中输入参数,下拉列表等,然后单击“搜索”,然后报告查看器将打开,以便它们可以打印。查询很难看,我已经对它做了一段时间了。这是以所需格式获得结果集的唯一方法。

SQL查询查找帮助,以缩短相同结果

代码语言:javascript
复制
DECLARE @EndReport DATETIME, @StartReport DATETIME, @Location INT, @Department varchar(50) 
SET @EndReport = '10-15-2018' SET @StartReport = '10-15-2018' SET @Department = 'fb' SET @Location = 10

SELECT row_number() over (order by (ai.FirstName + ' ' + ai.LastName)) RowNum
    ,AssociateName = isnull(upper(ai.FirstName + ' ' + ai.LastName),'**' + cast(t.ID as varchar(30)) + '**')
    ,ID = t.ID
    ,Codes = (t.DeptCode + '-' +  t.OpCode)
    ,TimeSUM = cast(SUM(datediff(second,StartTime, FinishTime) /3600.0) as decimal (6,2))
    ,Units = SUM(Units)
    ,UPH = cast(isnull(sum(Units) / nullif(sum(datediff(minute,StartTime,FinishTime))*1.0,0),0.0)*60  as decimal(10,0))
    into temptable10
FROM TimeLogNEW t LEFT JOIN AssociateInfo ai
ON t.ID = ai.ID
JOIN GoalSetUp g
ON (t.DeptCode + '-' + t.OpCode) = (g.DeptCode + '-' + g.OpCode)
WHERE EventDate between @StartReport and @EndReport 
and t.Location = @Location and g.location= @Location and  ((t.DeptCode + t.OpCode) in (g.DeptCode + g.OpCode)) and t.DeptCode = @Department
GROUP BY t.DeptCode,t.OpCode,ai.FirstName,ai.LastName, t.ID

SELECT 
 [Associate Name] = AssociateName
,[Codes] = Codes 
,[TimeSUM] = TimeSUM
,[Units] = Units
,[UPH] = UPH
,[UPH Target] = Goal
,[Actual %] = CASE WHEN goal = 0 then '0%' 
        else convert(varchar,cast(100* (isnull(UPH,0)/nullif(Goal,0)) as decimal(10,0))) + '%' END   
FROM goalsetup g join temptable10 on g.DeptCode = left(codes,2)and g.opcode = RIGHT(codes,2) 
WHERE g.Location = @Location    
ORDER BY Codes, UPH Desc
drop table temptable10

SQL结果集

错误

添加可视化工作室屏幕截图。在以下答复后更新

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-30 06:20:31

我不知道这是否有效,因为我没有可测试的表。(也就是说,如果它出错了,您将不得不决定该做什么。)

  • row_number()列没有明显的理由,所以我删除了它
  • Codes = (t.DeptCode + '-' + t.OpCode)在创建表时,后面跟着:
  • join temptable10 on g.DeptCode = left(codes,2)and g.opcode = RIGHT(codes,2)
  • 这是低效的,也是不必要的,只需保留两列。
  • 事实上,出现了很多对dept & op代码的级联,这似乎是不必要的,只需使用这2列就可以了,而不需要额外的努力。
  • between是用于日期范围的狗,我强烈建议使用我在下面的查询中所拥有的内容。>=< (+1 day)的此日期范围构造适用于所有日期/时间数据类型。
  • 当引用任何列时,请使用表别名,像我这样的读者无法知道其中一些列来自哪个表,这使得调试/维护变得更加困难。

建议的查询:

代码语言:javascript
复制
DECLARE @EndReport datetime
      , @StartReport datetime
      , @Location int
      , @Department varchar(50)
SET @EndReport = '10-15-2018'
SET @StartReport = '10-15-2018'
SET @Department = 'fb'
SET @Location = 10

SELECT
    AssociateName = ISNULL(UPPER(ai.FirstName + ' ' + ai.LastName), '**' + CAST(t.ID AS varchar(30)) + '**')
  , ID =            t.ID
  , Codes =         (t.DeptCode + '-' + t.OpCode)
  , t.DeptCode
  , t.OpCode
  , TimeSUM =       CAST(SUM(DATEDIFF(SECOND, StartTime, FinishTime) / 3600.0) AS decimal(6, 2))
  , Units =         SUM(Units)
  , UPH =           CAST(ISNULL(SUM(Units) / NULLIF(SUM(DATEDIFF(MINUTE, StartTime, FinishTime)) * 1.0, 0), 0.0) * 60 AS decimal(10, 0)) 
INTO temptable10
FROM TimeLogNEW t
LEFT JOIN AssociateInfo ai
    ON t.ID = ai.ID
JOIN GoalSetUp g
    ON t.DeptCode = g.DeptCode  AND t.OpCode = g.OpCode
WHERE EventDate >= @StartReport AND EventDate < dateadd(day,1,@EndReport)
AND t.Location = @Location
AND g.location = @Location
AND t.DeptCode = @Department
GROUP BY
    t.DeptCode
  , t.OpCode
  , ai.FirstName
  , ai.LastName
  , t.ID

SELECT
    [Associate Name] =  t10.AssociateName
  , [Codes] =           t10.Codes
  , [TimeSUM] =         t10.TimeSUM
  , [Units] =           t10.Units
  , [UPH] =             t10.UPH
  , [UPH Target] =      g.Goal
  , [Actual %] =       
                CASE
                    WHEN g.goal = 0 THEN '0%'
                    ELSE CONVERT(varchar, CAST(100 * (ISNULL(t10.UPH, 0) / NULLIF(g.Goal, 0)) AS decimal(10, 0))) + '%'
                END
FROM goalsetup g
JOIN temptable10 t10
    ON g.DeptCode = t10.DeptCode
    AND g.opcode = t10.opcode
WHERE g.Location = @Location
ORDER BY
     t10.Codes
  ,  t10.UPH DESC

DROP TABLE temptable10
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53058016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档