两个查询的并集

特伦特

我正在尝试按如下方式合并两个查询(别名是我解决该问题的尝试之一);

SELECT a.Day, a.[Away Days], a.[Office Days] 
FROM (SELECT DATENAME(dw, Date) AS 'Day', SUM(Hours)/8 AS 'Away Days', NULL AS 'Office Days' 
    FROM  TimesheetDays 
    WHERE id_LineItem IN 
        (SELECT idLineItem FROM TimesheetLineItems 
        WHERE id_Timesheet IN 
            (SELECT idTimesheet 
            FROM Timesheets 
            WHERE id_User = 314) 
        AND id_Leave IS NOT NULL AND id_Leave != 4)
    AND Date < GETDATE()
    GROUP BY DATENAME(dw,Date)) a

UNION

SELECT b.Day, b.[Away Days], b.[Office Days] 
FROM (SELECT DATENAME(dw, Date) AS 'Day', NULL AS 'Away Days', SUM(Hours)/8 AS 'Office Days' 
    FROM TimesheetDays 
    WHERE id_LineItem IN 
        (SELECT idLineItem FROM TimesheetLineItems 
        WHERE id_Timesheet IN 
            (SELECT idTimesheet 
            FROM Timesheets 
            WHERE id_User = 314) 
        AND Offshore = 0 AND (id_Leave IS NULL OR id_Leave != 4))
    AND Date < GETDATE()
    GROUP BY DATENAME(dw,Date)) b

问题在于这没有进行适当的合并。我想知道是否是Group By破坏了事情,但是我不这么认为吗?

这是一个示例结果;

Day         Away Days   Office Days
Friday      NULL        23.0125
Friday      7           NULL
Monday      NULL        24
Monday      6           NULL
Thursday    NULL        26
Thursday    5.5         NULL
Tuesday     NULL        25.9375
Tuesday     7.5         NULL
Wednesday   NULL        26.05
Wednesday   8           NULL

我正在寻找的是两个值都在同一行,而不是具有NULL,而且我不太确定为什么会发生这种情况(对它的理解以及解决方案将不胜感激)。

我想保留别名,因为我想添加第4列以及比率和其他可能的东西也很好。

文妮

您可以将两者结合使用,并使用相同的逻辑。

SELECT a.Day, ISNULL(a.[Away Days],b.[Away Days]) as [Away Days], ISNULL(a.[Office Days],b.[Office Days]) as [Office Days] 
FROM (SELECT DATENAME(dw, Date) AS 'Day', SUM(Hours)/8 AS 'Away Days', NULL AS 'Office Days' 
    FROM  TimesheetDays 
    WHERE id_LineItem IN 
        (SELECT idLineItem FROM TimesheetLineItems 
        WHERE id_Timesheet IN 
            (SELECT idTimesheet 
            FROM Timesheets 
            WHERE id_User = 314) 
        AND id_Leave IS NOT NULL AND id_Leave != 4)
    AND Date < GETDATE()
    GROUP BY DATENAME(dw,Date)) a

JOIN   (SELECT DATENAME(dw, Date) AS 'Day', NULL AS 'Away Days', SUM(Hours)/8 AS 'Office Days' 
    FROM TimesheetDays 
    WHERE id_LineItem IN 
        (SELECT idLineItem FROM TimesheetLineItems 
        WHERE id_Timesheet IN 
            (SELECT idTimesheet 
            FROM Timesheets 
            WHERE id_User = 314) 
        AND Offshore = 0 AND (id_Leave IS NULL OR id_Leave != 4))
    AND Date < GETDATE()
    GROUP BY DATENAME(dw,Date)) b ON a.Day = b.Day

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章