我正在尝试编写一个SQL查询来跟踪JIRA中的帐户使用情况。对于SQL来说,我还是一个新手,所以请忍受:)
我能够获取已登录用户的登录计数。但是,我运气不佳,包括从未使用过的帐户。
下面是 cwd_user_attributes表的示例-该表包含登录计数,上次登录日期等。用户登录后,“ login.count” 将显示在 attribute_name 列下。但是,如果用户从未登录过,例如user_id 19313(又名Dave用户),则'login.count'不存在。
+-------+---------+-------------------------------+-----------------+
| ID | user_id | attribute_name | attribute_value |
+-------+---------+-------------------------------+-----------------+
| 17378 | 10000 | lastAuthenticated | 1524069213477 |
| 17382 | 10000 | login.count | 2576 |
| 17380 | 10000 | login.lastLoginMillis | 1524069213493 |
| 17377 | 10000 | requiresPasswordChange | FALSE |
| 23542 | 16714 | lastAuthenticated | 1525888024307 |
| 23549 | 16714 | login.count | 1927 |
| 23548 | 16714 | login.lastLoginMillis | 1525888024322 |
| 23537 | 16714 | requiresPasswordChange | FALSE |
| 27555 | 19313 | password.reset.request.expiry | 1494599702231 |
| 27554 | 19313 | passwordLastChanged | 1494513302168 |
| 27552 | 19313 | requiresPasswordChange | FALSE |
+-------+---------+-------------------------------+-----------------+
我正在尝试编写一个查询,该查询将在 attribute_name 列中出现'login.count'行时返回attribute_value,并且还将返回结果如果没有'login.count'行,则为'0'。
这是我到目前为止所拥有的。不幸的是,可以理解的是,这不包括我的19313 / Dave用户。
SELECT
u.user_name AS [USER NAME]
,m.parent_name AS [GROUP]
,ua.attribute_value AS [LOGIN COUNT]
,u.updated_date AS [LAST LOGIN]
,u.created_date AS [CREATED]
FROM jira.cwd_user AS u LEFT JOIN
jira.cwd_user_attributes AS ua ON u.ID = ua.user_id LEFT JOIN
jira.cwd_membership AS m ON u.ID = m.child_id AND u.directory_id = m.directory_id LEFT JOIN
jira.cwd_directory AS d ON m.directory_id = d.ID
WHERE (d.active = '1') AND (u.active = '1') AND (m.parent_name <> 'non-jira-users') AND (ua.attribute_name = 'login.count')
结果
+-----------+-------------+-------------------------+-------------------------+
| USER NAME | LOGIN COUNT | LAST LOGIN | CREATED |
+-----------+-------------+-------------------------+-------------------------+
| Mark | 2576 | 2012-09-26 17:06:11.400 | 2012-09-26 17:06:11.400 |
| Joe | 1927 | 2016-06-21 11:41:03.897 | 2016-04-19 13:31:21.847 |
+-----------+-------------+-------------------------+-------------------------+
经过大量研究,我认为“何时存在” 子句是我最好的选择。而且,如果我从WHERE子句中删除 *“(ua.attribute_name ='login.count')” ,它将返回所有用户(是的!),但它还会返回所有attribute_names也一样显然,这不会创建“ login.count”行...
SELECT
u.user_name AS [USER NAME]
,m.parent_name AS [GROUP]
,CASE
WHEN EXISTS
(SELECT ua.attribute_value
WHERE ua.attribute_name = 'login.count')
THEN ua.attribute_value
ELSE 0
END AS [LOGIN COUNT]
,u.updated_date AS [LAST LOGIN]
,u.created_date AS [CREATED]
FROM jira.cwd_user AS u LEFT JOIN
jira.cwd_user_attributes AS ua ON u.ID = ua.user_id LEFT JOIN
jira.cwd_membership AS m ON u.ID = m.child_id AND u.directory_id = m.directory_id LEFT JOIN
jira.cwd_directory AS d ON m.directory_id = d.ID
WHERE (d.active = '1') AND (u.active = '1') AND (m.parent_name <> 'non-jira-users')
结果
+-----------+-------------+------------+-----------+
| USER NAME | LOGIN COUNT | LAST LOGIN | CREATED |
+-----------+-------------+------------+-----------+
| Mark | 0 | 9/26/2012 | 9/26/2012 |
| Mark | 0 | 9/26/2012 | 9/26/2012 |
| Mark | 2576 | 2/14/2019 | 9/26/2012 |
| Mark | 0 | 9/26/2012 | 9/26/2012 |
| Joe | 1927 | 2/14/2019 | 4/19/2016 |
| Joe | 0 | 6/21/2016 | 4/19/2016 |
| Joe | 0 | 6/21/2016 | 4/19/2016 |
| Joe | 0 | 6/21/2016 | 4/19/2016 |
| Dave | 0 | 5/11/2017 | 5/11/2017 |
| Dave | 0 | 5/11/2017 | 5/11/2017 |
| Dave | 0 | 5/11/2017 | 5/11/2017 |
+-----------+-------------+------------+-----------+
我正在努力达到以下最终目标:
+-----------+-------------+------------+-----------+
| USER NAME | LOGIN COUNT | LAST LOGIN | CREATED |
+-----------+-------------+------------+-----------+
| Mark | 2576 | 9/26/12 | 9/26/12 |
| Joe | 1927 | 6/21/16 | 4/19/16 |
| Dave | 0 | NULL | 5/11/2017 |
+-----------+-------------+------------+-----------+
这本小说的道歉-试图包含尽可能多的相关信息:)预先谢谢您!
已编辑19/2/15 阅读Chuck的回复后,我正在尝试他的建议。我还没到那儿,但是我至少在正确的轨道上吗?抱歉-这对我来说是新的。
谢谢!
SELECT
u.user_name AS [USER NAME]
,ua.attribute_value AS [LOGIN COUNT]
,u.updated_date AS [LAST LOGIN]
,u.created_date AS [CREATED]
FROM dbo.cwd_user AS u LEFT JOIN
dbo.cwd_user_attributes AS ua ON u.ID = ua.user_id
LEFT JOIN
(SELECT
,CASE
WHEN EXISTS
(
SELECT ua1.attribute_value
WHERE ua1.attribute_name = 'login.count'
)
THEN ua1.attribute_value
ELSE 0
END AS [LOGIN COUNT]
FROM dbo.cwd_user AS u1 LEFT JOIN
dbo.cwd_user_attributes AS ua1 ON u1.ID = ua1.user_id
) AS sq
ON ua.attribute_value = sq.attribute_value
WHERE (u.active = '1') AND (ua.attribute_name = 'login.count')