【问题标题】:How to show two weeks by Day in same GridView?如何在同一个 GridView 中按天显示两周?
【发布时间】:2014-05-26 16:02:07
【问题描述】:

我正在使用此查询来获取每位员工两周的总工资期。

select FullName
,[Sunday] = SUM([Sunday])
,[Monday] = SUM([Monday])
,[Tuesday] = SUM([Tuesday])
,[Wednesday] = SUM([Wednesday])
,[Thursday] = SUM([Thursday])
,[Friday] = SUM([Friday])
,[Saturday] = SUM([Saturday])
, Total=SUM(ISNULL([Sunday],0)+ISNULL([Monday],0)+ISNULL([Tuesday],0)+ISNULL([Wednesday],0)+ISNULL([Thursday],0)+ISNULL([Friday],0)+ISNULL([Saturday],0))
   from  
    (Select UserId_Fk,ISNULL(CAST(CountHours as decimal(18,2)),0)as CountHours,[Day],CheckIn 
    from CheckInCheckOut)
    as convertedtable
    inner join Users
    on convertedtable.UserId_Fk=Users.UserId
 PIVOT
(
 SUM(CountHours) 
 FOR Day
 IN([Sunday],[Monday],[Tuesday],[Wednesday],[Thursday],[Friday],[Saturday])
)
as PivotTable where CheckIn between @startdate and @enddate 
GROUP BY FullName
end

输出是这样的:

如何更新我的查询以将其显示为:

 Monday Tuesday Wednesday Thursday Friday Saturday Sunday Monday Tuesday Wednesday Tursday Friday Saturday **Total**

数据库中的数据是:

编辑 我有一个名为 Paperiod 的表格,其中列出了当年的所有支付期:

表格的第一行是:

    Monday  21 Apr 2014 - 4 May 2014    

 ![enter image description here][3]

示例将不胜感激。

【问题讨论】:

  • 第一个星期日是哪个星期日?一个支付期是从 2014-05-04 到 2014-05-17,还是从 2014-05-11 到 2014-05-24?
  • 我很好奇您是如何填充 Day 列的。例如,第一行中的所有日期均指 2014-05-15,即星期四,但 Day 列有星期三。您的查询是否基于 Day 列的内容?还是基于日期字段之一?
  • @DavidDubois 请查看更新。我带来了当天的数据。
  • 你不能有两次相同的别名,你必须在表示层解决这个问题

标签: sql sql-server-2008 pivot-table common-table-expression


【解决方案1】:

从计算从支付期开始到员工工作之日的天数的查询开始。

select *, 
  DateDiff(day, @start_date, Day_Worked) as Day_Of_Period 
  from WorkHours 

在本例中,新字段 Day_Of_Period 将是从 0 到 13 的数字。

然后根据该新字段生成数据透视表。

【讨论】:

  • 我尝试了你的实现,但没有成功。我知道我可以按照你的建议去做...你能告诉我如何将你的实现集成到我的查询中吗?
【解决方案2】:

希望对您有帮助

SELECT 
    t1.FullName
    ,t1.[Monday]
    ,t1.[Tuesday]
    ,t1.[Wednesday]
    ,t1.[Thursday]
    ,t1.[Friday]
    ,t1.[Saturday]
    ,t1.[Sunday]
    ,t2.[Monday]
    ,t2.[Tuesday]
    ,t2.[Wednesday]
    ,t2.[Thursday]
    ,t2.[Friday]
    ,t2.[Saturday]
    ,t2.[Sunday]
    ,(t1.Total + t2.Total) AS Total
FROM 
    (
        SELECT FullName
            ,[Sunday] = SUM([Sunday])
            ,[Monday] = SUM([Monday])
            ,[Tuesday] = SUM([Tuesday])
            ,[Wednesday] = SUM([Wednesday])
            ,[Thursday] = SUM([Thursday])
            ,[Friday] = SUM([Friday])
            ,[Saturday] = SUM([Saturday])
            ,Total = SUM(ISNULL([Sunday], 0) + ISNULL([Monday], 0) + ISNULL([Tuesday], 0) + ISNULL([Wednesday], 0) + ISNULL([Thursday], 0) + ISNULL([Friday], 0) + ISNULL([Saturday], 0))
        FROM (
            SELECT UserId_Fk
                ,ISNULL(CAST(CountHours AS DECIMAL(18, 2)), 0) AS CountHours
                ,[Day]
                ,CheckIn
            FROM CheckInCheckOut
            ) AS convertedtable
        INNER JOIN Users ON convertedtable.UserId_Fk = Users.UserId
        PIVOT(SUM(CountHours) FOR Day IN (
                    [Sunday]
                    ,[Monday]
                    ,[Tuesday]
                    ,[Wednesday]
                    ,[Thursday]
                    ,[Friday]
                    ,[Saturday]
                    )) AS PivotTable
        WHERE CheckIn BETWEEN @startdate
                AND dateadd(day, 7, @startdate)
        GROUP BY FullName
    ) AS t1
INNER JOIN 
    (
        SELECT FullName
            ,[Sunday] = SUM([Sunday])
            ,[Monday] = SUM([Monday])
            ,[Tuesday] = SUM([Tuesday])
            ,[Wednesday] = SUM([Wednesday])
            ,[Thursday] = SUM([Thursday])
            ,[Friday] = SUM([Friday])
            ,[Saturday] = SUM([Saturday])
            ,Total = SUM(ISNULL([Sunday], 0) + ISNULL([Monday], 0) + ISNULL([Tuesday], 0) + ISNULL([Wednesday], 0) + ISNULL([Thursday], 0) + ISNULL([Friday], 0) + ISNULL([Saturday], 0))
        FROM (
            SELECT UserId_Fk
                ,ISNULL(CAST(CountHours AS DECIMAL(18, 2)), 0) AS CountHours
                ,[Day]
                ,CheckIn
            FROM CheckInCheckOut
            ) AS convertedtable
        INNER JOIN Users ON convertedtable.UserId_Fk = Users.UserId
        PIVOT(SUM(CountHours) FOR Day IN (
                    [Sunday]
                    ,[Monday]
                    ,[Tuesday]
                    ,[Wednesday]
                    ,[Thursday]
                    ,[Friday]
                    ,[Saturday]
                    )) AS PivotTable
        WHERE CheckIn BETWEEN dateadd(day, 7, @startdate)
                AND @enddate
        GROUP BY FullName
    ) AS t2 ON t1.FullName = t2.FullName

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 2019-06-22
    • 2018-09-07
    • 2019-01-13
    • 2016-03-01
    • 1970-01-01
    • 2014-07-21
    相关资源
    最近更新 更多