具有 group by 和/或 distinct 和 pivot 的复杂 SQL Server 查询

Posted

技术标签:

【中文标题】具有 group by 和/或 distinct 和 pivot 的复杂 SQL Server 查询【英文标题】:Complex SQL Server query with group by and/or distinct and pivot 【发布时间】:2013-03-13 21:51:07 【问题描述】:

我有一张表 (UserAction),其结构如下:

UserActionPK - unique primary key of the UserAction table
AgencyCode - unique name for an agency
EditedKEY - key of a table edited by the user
UserName - name of the user that edited the record
EditedDate - day on which the edit was made

我需要查询这些数据并最终得到一个数据集,其中包含 AgencyCode 的一列,以及一组用户(例如 [JohnDoe]、[JoeSmith]、[SomeGuy])中的每个用户的一列。在每个用户的列中,它将列出用户执行的 UserAction 总数。例如/

AgencyCode   JohnDoe   JoeSmith   SomeGuy
ABC          1         3          4
DEF          0         7          2

但是,有一种特殊情况。如果用户在同一天 (EditedDate) 对同一条确切记录 (EditedKEY) 执行了多个操作,那么它应该只计为 1 个操作。例如,如果 JohnDoe 在 2013 年 1 月 1 日编辑了 EditedKEY 为“XXX”的记录 1 次,然后在 2013 年 1 月 2 日编辑了相同的 EditedKEY 记录“XXX” 3 次,则应仅计为 2对总数进行编辑。在旋转它之前,我基本上只需要对 EditedDate 值进行分组。请注意,EditedKEY 值是一个 guid,因此即使在机构之间它也始终是唯一的。

我有一个查询可以获取我需要的数据并将其转置,但没有将 UserAction 与相同的 EditedDate、UserName 和 AgencyCode 分组:

select * from
(
    select UserActionKEY, AgencyCode, EditedDate, UserName
    from UserAction
    where EditedDate >= @FromDate
    and EditedDate <= @ToDate
) Pivot1
pivot
(
    count(UserActionKEY) 
    for UserName in 
    (
        [JohnDoe],
        [JohnSmith],
        [SomeGuy],
    )
) Pivot2

如何让它按天/用户/机构对这些操作进行分组?

更新 - 以下是所要求的一些示例数据:

UserActionPK                            AgencyCode  EditedKEY                               UserName    EditedDate
0F573329-0C83-44B8-AD9A-808D8795FCCF    ABC         521A63CD-AEEF-44BF-BDCB-EE96373AC39A    JohnDoe     3/11/2013
36321DB6-DA1B-430E-B85C-36372088860E    ABC         521A63CD-AEEF-44BF-BDCB-EE96373AC39A    JohnDoe     3/11/2013
BDC9B165-CC93-409A-BEAE-3365709F6E54    ABC         042D633F-47AC-4A5C-BE3B-B179E01AD5C9    JohnDoe     3/11/2013
2475344C-80DD-4898-A7CD-B41B2593F0FE    DEF         F6016422-BB24-4B39-A735-BCD1206AEA4A    JohnDoe     3/11/2013
3CD7B9BB-428A-45E9-B254-8A2FD502B9F7    DEF         C9A028F6-6E1A-4FD6-A549-D932BC20AA88    JohnDoe     3/11/2013
B0348158-1455-42DF-81EB-29704F08E920    ABC         6937C16A-752A-4D69-BBE9-932015B8C137    JohnDoe     3/12/2013
F1C5950D-05D2-48B6-BFC3-1C32FD970F76    ABC         521A63CD-AEEF-44BF-BDCB-EE96373AC39A    JohnDoe     3/12/2013
502F67A2-6448-48FB-8BFE-74D21592BA48    ABC         B3371961-06EE-4CD3-9373-87102EB793FA    JoeSmith    3/11/2013
E797DFE0-8693-44FC-821F-46B745B37533    ABC         79E1F21F-C7D3-4F8C-8D51-536C34FF84D4    JoeSmith    3/11/2013

在此示例中,JohnDoe 列应该对机构“ABC”有 4 个操作计数,即使他对该机构有 5 条记录,因为他对同一个“EditedKEY”有 2 个操作 (521A63CD-AEEF-44BF- BDCB-EE96373AC39A) 当天,仅计为 1 次操作。

【问题讨论】:

你能从你的表中发布一些数据吗? 【参考方案1】:

您希望对分组条件加上一个附加字段Value = 1 执行SELECT DISTINCT,而不是直接COUNT(...)。然后执行SUM(Value) 代替您的COUNT(...)

【讨论】:

【参考方案2】:

这种转换通常最好使用客户端应用程序代码完成,而不是在 SQL 中。 SQL 代码需要在前端知道查询开头的结果列有多少个和名称。

【讨论】:

以上是关于具有 group by 和/或 distinct 和 pivot 的复杂 SQL Server 查询的主要内容,如果未能解决你的问题,请参考以下文章

distinct和group by的区别

Distinct和Group by去除重复字段记录

ORA-01446 - 无法使用 DISTINCT、GROUP BY 等从视图中选择 ROWID

group by与distinct有何区别

Group by 和distinct对比

sqlserver 用distinct和group by哪个效率高