对于包含数据的每一行,每个类别都需要一行

用户名

我有时间表数据,需要按日期范围创建报告。我需要为每个人每一天每一行,每种时间类型。如果在给定的日期没有针对该时间类型的条目,我想要空数据。我尝试了左联接,但似乎没有用。交叉联接将提供错误的数据。

我拥有的Person表格表格(personID, Name),TimeLog表格(TimeLogID, StartDate, EndDate, TimeLogTypeID)和TimeLogType表格(TimeLogTypeID, PersonID, Description, DeletedInd

我在结果集中所能得到的就是带有数据的行,而不是每个数据的空行 TimeLogType

这是我到目前为止的内容:

DECLARE 
    @startDate  DATE,
    @endDate    DATE

SET @startDate = '2014-05-01'
SET @endDate =   '2014-05-30'

SELECT
    CONVERT(DATE, TimeLog.StartDateTime, 101) AS TimeLogDay,
    SUM(dbo.fnCalculateHoursAsDecimal(TimeLog.StartDateTime, TimeLog.EndDateTime)) AS Hours,
    TimeLog.PersonID,
    TimeLog.TimeLogTypeID

INTO #HourTable

FROM
    TimeLog

WHERE   
    TimeLog.StartDateTime BETWEEN @startDate AND @endDate

GROUP BY
    CONVERT(DATE, TimeLog.StartDateTime, 101),
    TimeLog.TimeLogTypeID,  
    TimeLog.PersonID

SELECT 
    TimeLogType.Description,    
    #HourTable.*
FROM 
    TimeLogType LEFT JOIN
    #HourTable ON TimeLogType.TimeLogTypeID = #HourTable.TimeLogTypeID

WHERE 
    ISNULL(TimeLogType.DeletedInd, 0) = 0

ORDER BY
    PersonID, TimeLogDay, TimeLogType.TimeLogTypeID

数据如下所示:

TimeLogType:
1,可结算
2,不可结算

人:
1,比利
2,汤姆

TimeLog:
1,1,2014-05-01 8点00分00秒,2014-05-01 9时00分00秒,1,0
2,1,2014-05-01 9时00分00秒,2014-05- 01 10:00:00,1,0 3,2,2014-05-01 08:
00
:00,2014-05-01 08:30:00,2,0 4,2,2014-05-01 08: 30:00,2014-05-01 09:00:
00,1,0 5,1,2014-05-02 08:00:00,2014-05-02 09:00:00,2,0

预期输出:(按人,日期,时间日志类型排序)
天,人,账单类型,总工时
2014-05-01,比利,可计费,2.0
2014-05-01,比利,不可计费,空值
2014-05- 02,Billy,Billiable,1.0
2014-05-02,Billy,Non-Billiable,NULL
等...
2014-05-01,Tom,Billiable,0.5
2014-05-01,Tom,Non-Billiable,0.5
等..

用户名

阅读戈登的答案后,这就是我的想法。我逐步创建了它,以便可以看到发生了什么。我创建的日期不包含master..spt_values表。我还创建了一个临时人员表,因此我可以只选择具有TimeLogRecord的人员,然后重新使用它为最终选择输入详细信息。让我知道是否有任何方法可以使运行速度更快。

DECLARE 
    @startDate  DATE,
    @endDate    DATE

SET @startDate = '2014-01-01'
SET @endDate =   '2014-01-31'

-- create day rows --
;WITH dates(TimeLogDay) AS 
(
    SELECT @startDate AS TimeLogDay
    UNION ALL
    SELECT DATEADD(d, 1, TimeLogDay)
    FROM dates 
    WHERE TimeLogDay < @enddate
)

-- create a type row for each day --
SELECT
    dates.TimeLogDay,
    tlt.TimeLogTypeID

INTO #TypeDate

FROM 
    dates CROSS JOIN 
    (SELECT
        TimeLogType.TimeLogTypeID
     FROM 
        TimeLogType 
     WHERE 
        ISNULL(TimeLogType.DeletedInd, 0) = 0
    ) AS TLT 

-- create a temp person table for referance later ---
SELECT * INTO #person FROM Person WHERE Person.personID IN 
        (SELECT Timelog.PersonID FROM TimeLog WHERE TimeLog.StartDateTime BETWEEN @startDate AND @endDate)

-- sum up the log times and tie in the date/type rows --
SELECT  
    #TypeDate.TimeLogDay,
    #TypeDate.TimeLogTypeID,
    #person.PersonID,
    SUM(dbo.fnCalculateHoursAsDecimal(TimeLog.StartDateTime, TimeLog.EndDateTime)) AS Hours

INTO #Hours

FROM
    #person CROSS JOIN
    #TypeDate LEFT JOIN
    TimeLog ON
        TimeLog.PersonID = #person.PersonID AND
        TimeLog.TimeLogTypeID = #TypeDate.TimeLogTypeID AND
        #TypeDate.TimeLogDay = CONVERT(DATE, TimeLog.StartDateTime, 101)

GROUP BY
    #TypeDate.TimeLogDay,
    #TypeDate.TimeLogTypeID,
    #person.PersonID

-- now tie in the details to complete --
SELECT
    #Hours.TimeLogDay,
    TimeLogType.Description,
    Person.LastName,
    Person.FirstName,
    #Hours.Hours

FROM
    #Hours LEFT JOIN
    Person ON #Hours.PersonID = Person.PersonID LEFT JOIN
    TimeLogType ON #Hours.TimeLogTypeID = TimeLogType.TimeLogTypeID

ORDER BY
    Person.FirstName,
    Person.LastName,
    #Hours.TimeLogDay,
    TimeLogType.SortOrder

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用php mysql逐一显示每一类别的每一行

来自分类Dev

SQLite选择每个类别的第一行

来自分类Dev

如果数据的每一行都分开了,是否可以解析R中的数据?

来自分类Dev

对于每一行,查找以前的行是否包含更高的值

来自分类Dev

对于每个组,选择第一行,然后选择与条件匹配的另一行

来自分类Dev

遍历pyspark数据框的行,但将每一行都保留为一个数据框

来自分类Dev

如何返回与熊猫数据框中的每一行都符合条件的列标题?

来自分类Dev

如何为R中的数据表中的每一行创建子类别

来自分类Dev

如何在数据的每个“类别”更改之间的SQL结果中添加一行?

来自分类Dev

对于每一行,保存到json

来自分类Dev

将一行中的每个列与数据库sql中的每一行进行比较

来自分类Dev

如何与熊猫循环:“对于文件中的每一行,对于每一行中的列”

来自分类Dev

每个类别仅选择一行

来自分类Dev

是否对每一行都进行更改?

来自分类Dev

删除每个表中包含userid列的每一行

来自分类Dev

对于包含类别名称的每个类别行,从产品表中仅获取一行

来自分类Dev

对于每一行,哪些列包含值

来自分类Dev

SQLite选择每个类别的第一行

来自分类Dev

Firebird“对于每一行”触发语法

来自分类Dev

每一行都无法回声不同

来自分类Dev

php脚本返回包含单词的每一行

来自分类Dev

数据的每一行的箱线图

来自分类Dev

为每个对应的选择更新每一行

来自分类Dev

跳过一行而不是“对于rng.Rows中的每一行”的VBA代码

来自分类Dev

从recyclerview的每一行获取数据

来自分类Dev

需要分裂; 将数据分成不同的行,然后获取每一行的计数

来自分类Dev

如何删除包含数据的范围中的每一行?

来自分类Dev

对于每个循环似乎没有迭代每一行

来自分类Dev

jquery - 对于包含字符串禁用按钮的每一行

Related 相关文章

  1. 1

    使用php mysql逐一显示每一类别的每一行

  2. 2

    SQLite选择每个类别的第一行

  3. 3

    如果数据的每一行都分开了,是否可以解析R中的数据?

  4. 4

    对于每一行,查找以前的行是否包含更高的值

  5. 5

    对于每个组,选择第一行,然后选择与条件匹配的另一行

  6. 6

    遍历pyspark数据框的行,但将每一行都保留为一个数据框

  7. 7

    如何返回与熊猫数据框中的每一行都符合条件的列标题?

  8. 8

    如何为R中的数据表中的每一行创建子类别

  9. 9

    如何在数据的每个“类别”更改之间的SQL结果中添加一行?

  10. 10

    对于每一行,保存到json

  11. 11

    将一行中的每个列与数据库sql中的每一行进行比较

  12. 12

    如何与熊猫循环:“对于文件中的每一行,对于每一行中的列”

  13. 13

    每个类别仅选择一行

  14. 14

    是否对每一行都进行更改?

  15. 15

    删除每个表中包含userid列的每一行

  16. 16

    对于包含类别名称的每个类别行,从产品表中仅获取一行

  17. 17

    对于每一行,哪些列包含值

  18. 18

    SQLite选择每个类别的第一行

  19. 19

    Firebird“对于每一行”触发语法

  20. 20

    每一行都无法回声不同

  21. 21

    php脚本返回包含单词的每一行

  22. 22

    数据的每一行的箱线图

  23. 23

    为每个对应的选择更新每一行

  24. 24

    跳过一行而不是“对于rng.Rows中的每一行”的VBA代码

  25. 25

    从recyclerview的每一行获取数据

  26. 26

    需要分裂; 将数据分成不同的行,然后获取每一行的计数

  27. 27

    如何删除包含数据的范围中的每一行?

  28. 28

    对于每个循环似乎没有迭代每一行

  29. 29

    jquery - 对于包含字符串禁用按钮的每一行

热门标签

归档