我有一个表(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])。在每个用户的列中,它将列出用户执行的UserActions的总数。 EX /
AgencyCode JohnDoe JoeSmith SomeGuy
ABC 1 3 4
DEF 0 7 2
然而,有一个特例。如果用户在同一天(EditedDate)上对同一个确切记录(EditedKEY)执行多个操作,那么它应该只计为1个操作。例如,如果JohnDoe在2013年1月1日编辑了一个EditedKEY为“XXX”的记录,然后在2013年1月1日编辑了相同的EditedKEY记录“XXX”3次,那么这些记录只能算作2编辑总数。我基本上需要在旋转之前将EditedDate值分组。注意,EditedKEY值是一个guid,所以即使在代理商之间它也总是唯一的。
我有一个查询,它将获取我需要的数据并对其进行透视,但不使用相同的EditedDate,UserName和AgencyCode对UserActions进行分组:
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次动作。
答案 0 :(得分:1)
您希望对分组条件加上一个额外的字段COUNT(...)
进行SELECT DISTINCT,而不是直接Value = 1
。然后执行SUM(Value)
代替COUNT(...)
。
答案 1 :(得分:-1)
这种数据透视通常最好用客户端应用程序代码完成,而不是在SQL中完成。 SQL代码需要在前端知道查询开头的结果列的数量和名称。