如何将 Excel 公式转换/模拟为 SQL 查询
Posted
技术标签:
【中文标题】如何将 Excel 公式转换/模拟为 SQL 查询【英文标题】:How to convert/simulate Excel formula into SQL Query 【发布时间】:2016-11-22 13:18:00 【问题描述】:我使用下面的 sql 查询将一些数据从 SQL db 提取到 Excel,然后在 excel 中我添加了两个额外的列,它们各自的公式如下,用于分析。现在我正在尝试将这些 excel 公式作为 2 列添加到我的 sql 查询中,我遇到了麻烦,请您建议我如何将上述两个公式添加到我的 sql 查询中。
非常感谢。
-
2 个月以上公式 =
IF(LastAccessDate>TODAY()-(365/6),"","超过 2 个月")
持续时间检查公式 =IF(LastAccessDate-FirstAccessedDate=0,"Never
登录",LastAccessDate-FirstAccessedDate)
Sql 查询:
SELECT s.DomainName as UserId
,s.fullname as FullName
,MIN(DATEADD(HH,DATEDIFF(HH,GetUTCDate(),GetDate())), A.CreatedOn)) [FirstAccessAt]
,MAX(DATEADD(HH,(DATEDIFF(HH,GetUTCDate(),GetDate())),A.CreatedOn)) [LastAccessAt]
--Tried on my own
--,DATEPART(MM,DATEADD(HH,(DATEDIFF(HH,GetUTCDate(),GetDate())), A.CreatedOn))AS [Month]
--,(MAX(DATEADD(HH,(DATEDIFF(HH,GetUTCDate(),GetDate())), A.CreatedOn))> -6, GETDATE()) [OlderThan6Months]
FROM archive a
INNER JOIN Systemuser s
ON s.systemuserid = a.objectid
WHERE a.action = 54
and a.CreatedOn between '2015-05-22 00:00:00.000' and '2016-11-23 00:00:00.000'
GROUP BY s.FullName,s.DomainName --DATEPART(MM,DATEADD(HH,(DATEDIFF(HH,GetUTCDate(),GetDate())), A.CreatedOn))
ORDER BY [LastAccessAt] desc
【问题讨论】:
有人可以就我上面的查询提出建议,是否可以在上面的查询中添加 2 个条件,或者我已经进行了三个不同的查询。谢谢。 【参考方案1】:试试这个:
DECLARE @FirstAccessDate DATETIME;
DECLARE @LastAccessDate DATETIME;
DECLARE @Today DATETIME;
SET @FirstAccessDate = '20160920';
SET @LastAccessDate = '20160922';
SET @Today = '20161122';
SELECT CASE WHEN DATEADD(MONTH, 2, @LastAccessDate) >= @Today THEN NULL
ELSE 'Older than 2 months'
END AS IsOlderThanTwoMonths,
CASE WHEN @FirstAccessDate = @LastAccessDate THEN 'Never Logged On'
ELSE CAST(DATEDIFF(DAY, @FirstAccessDate, @LastAccessDate) AS VARCHAR(20))
END AS Duration;
SET @LastAccessDate = '20160921';
SET @FirstAccessDate = '20160921';
SELECT CASE WHEN DATEADD(MONTH, 2, @LastAccessDate) >= @Today THEN NULL
ELSE 'Older than 2 months'
END AS IsOlderThanTwoMonths ,
CASE WHEN @FirstAccessDate = @LastAccessDate THEN 'Never Logged On'
ELSE CAST(DATEDIFF(DAY, @FirstAccessDate, @LastAccessDate) AS VARCHAR(20))
END AS Duration;
所以你的查询应该是这样的:
SELECT
UserId,
FullName,
FirstAccessAt,
LastAccessAt,
CASE WHEN DATEADD(MONTH, 2, LastAccessAt) >= @Today THEN NULL
ELSE 'Older than 2 months'
END AS IsOlderThanTwoMonths,
CASE WHEN FirstAccessAt = LastAccessAt THEN 'Never Logged On'
ELSE CAST(DATEDIFF(DAY, FirstAccessAt, LastAccessAt) AS VARCHAR(20))
END AS Duration
FROM (
SELECT
s.DomainName as UserId,
s.fullname as FullName,
MIN(A.CreatedOn) AS FirstAccessAt,
MAX(A.CreatedOn) AS LastAccessAt
FROM archive a
INNER JOIN Systemuser s
ON s.systemuserid = a.objectid
WHERE
a.action = 54
and a.CreatedOn between '2015-05-22 00:00:00.000' and '2016-11-23 00:00:00.000'
GROUP BY
s.FullName, s.DomainName
) t
ORDER BY LastAccessAt DESC
【讨论】:
嗨 openshac,非常感谢您抽出宝贵时间回答我的查询。我正在尝试将上述两个条件语句包含到我的 sql 查询中并作为单个查询运行?请提出建议。 只需复制查询并将变量 FirstAccessDate、LastAccessDate、Today 替换为代码中的值。 必须声明标量变量“@Today”错误。你想让我插入 GetDate() 我已经通过声明@Today 来修复它。谢谢。现在将再次测试。 最好声明一个变量来存储getdate()的值***.com/a/12078717/283787【参考方案2】:是的,只需在两个语句之间添加一个逗号并替换 '列名' 具有唯一名称。
【讨论】:
我收到一条错误消息,提示“无效的列名 'LastAccessAt'。” 将您的第一个查询插入 #tmpTable,然后使用两个 case 语句查询 #tmpTable 现在将 LastAccessAt 作为有效列。【参考方案3】:1.超过 2 个月公式 = IF(LastAccessDate>TODAY()-(365/6),"","超过 2 个月")
在 TSQL 中:
CASE WHEN DateDiff(Month,LastAccessDate,GetDate()) >2 THEN '超过 2 个月' 否则为空 END AS 列名
2.持续时间检查公式 =IF(LastAccessDate-FirstAccessedDate=0,"Never Logged On",LastAccessDate-FirstAccessedDate)
在 TSQL 中:
CASE WHEN (LastAccessDate-FirstAccessDate)=0 然后“从不登录” ELSE (LastAccessDate-FirstAccessDate) END AS 列名
【讨论】:
嗨,khris-kramer,首先非常感谢您抽出宝贵时间回答我的问题。是否可以将上述两个案例语句包含到我的上述 SQL 查询中并作为单个查询运行?请提出建议。以上是关于如何将 Excel 公式转换/模拟为 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章
SQL 新手。想将 IF(COUNTIFS()) Excel 公式转换为 SQL 代码并让 SQL 计算它而不是 Excel
需要帮助将继承的 excel 公式转换为 SQL 或 DAX
如何将SQL查询结果转换为Excel表格推送给企业微信或钉钉的员工账号