在SQL语句中选择Case

时间:2017-07-31 10:49:31

标签: sql sql-server

我有以下SQL查询,它返回员工时间ATTENDANCE的以下输出。

注意,InOut = '0'表示其中,如果InOut = '1'表示其意味着。

查询:

SELECT
    DATEPART(mi, LogTime) AS [InMin],
    OutletName as [InOutletName]
FROM 
    [dbo].[AccessLog]
INNER JOIN 
    dbo.Outlets ON dbo.Outlets.OutletCode = dbo.AccessLog.TerminalID
WHERE 
    DATEPART(HOUR, LogTime) = '15'
    AND InOut = '0'
    AND CAST(LogDate AS date) = '2016-12-01'

输出:

InMin   InOutletName
--------------------
47      GJ-SH1

我正在寻找获得OutMin, OutOutletName的输出,这可以在InOut = '1'

时应用

期望的输出:

InMin   InOutletName OutMin OutOutletName
-----------------------------------------
47      GJ-SH1       10     GJ-SH1

3 个答案:

答案 0 :(得分:1)

我没有机会在我的SSMS中试用它,但必需的查询应该是这样的 -

SELECT
    Case When InOut = '0' Then DATEPART(mi, LogTime) End AS [InMin],
    Case When InOut = '0' Then OutletName End as [InOutletName],
    Case When InOut = '1' Then DATEPART(mi, LogTime) End AS [OutMin],
    Case When InOut = '1' Then OutletName End as [OutOutletName]
FROM 
    [dbo].[AccessLog]
INNER JOIN 
    dbo.Outlets ON dbo.Outlets.OutletCode = dbo.AccessLog.TerminalID
WHERE 
    DATEPART(HOUR, LogTime) = '15'
    AND CAST(LogDate AS date) = '2016-12-01';

答案 1 :(得分:0)

一个简单的解决方案是加入AccessLog表两次:

SELECT
        DATEPART(mi, ali.LogTime) AS [InMin],
        DATEPART(mi, alo.LogTime) AS [OutMin],
        OutletName as [InOutletName]
FROM dbo.Outlets
INNER JOIN [dbo].[AccessLog] ali
ON dbo.Outlets.OutletCode = ali.TerminalID
LEFT JOIN [dbo].[AccessLog] alo
ON dbo.Outlets.OutletCode = al0.TerminalID AND CAST(ali.LogDate AS date) = CAST(alo.LogDate AS date) AND alo.InOut = '1'
WHERE DATEPART(HOUR, LogTime) = '15'
AND ali.InOut = '0'
AND CAST(ali.LogDate AS date) = '2016-12-01'

请注意,对于表示我已使用AccessLog的日期的left join,您还将获得尚未注销的Outlet名称。

答案 2 :(得分:0)

我刚刚写了它,不确定结果,但你可以尝试一下。它可能有所帮助:

    ;with InQuery as (SELECT
    DATEPART(mi, LogTime) AS [InMin],
    OutletName as [InOutletName]
    FROM [dbo].[AccessLog]
    INNER JOIN dbo.Outlets
    ON dbo.Outlets.OutletCode = dbo.AccessLog.TerminalID
    WHERE DATEPART(HOUR, LogTime) = '15'
    AND InOut = '0'
    AND CAST(LogDate AS date) = '2016-12-01'),
    OutQuery As (SELECT
    DATEPART(mi, LogTime) AS [OutMin],
    OutletName as [OutOutletName]
    FROM [dbo].[AccessLog]
    INNER JOIN dbo.Outlets
    ON dbo.Outlets.OutletCode = dbo.AccessLog.TerminalID
    WHERE DATEPART(HOUR, LogTime) = '15'
    AND InOut = '1'
    AND CAST(LogDate AS date) = '2016-12-01')

    select iq.*, oq.* from InQuery iq, OutQuery oq