数据透视表中的从属和绑定筛选器

时间:2018-06-29 06:45:36

标签: sql excel pivot pivot-table

在Sheet1中,我有看起来像这样的原始数据:

event_name | country | event_datetime | event_day | vertical | some_metric
fun day 2018 | uk | 1/1/2018 22:00 | 1/1/2018 | something | 100
fun day 2018 | uk | 1/1/2018 23:00 | 1/1/2018 | something | 200
fun day 2018 | uk | 2/1/2018 00:00 | 2/1/2018 | something | 300
fun day 2017 | uk | 1/1/2017 22:00 | 1/1/2017 | something | 400
fun day 2017 | uk | 1/1/2017 23:00 | 1/1/2017 | something | 500
fun day 2017 | uk | 2/1/2017 00:00 | 2/1/2017 | something | 600

event_datetime四舍五入到最接近的小时。活动可以持续多天。

在Sheet2中,我使用所有这些数据创建数据透视表。过滤器是event_name,国家/地区,event_datetime;第一列是垂直的,值是sum(some_metric)。

是否有一种方法可以使显示的日期取决于所选的event_name? ,例如如果我选择欢乐日2018,我只希望与该事件对应的日期显示在event_datetime过滤器下拉列表中(即对于欢乐日2018,只有1/1/2018和2/1/2018以及所有对应的时间都应出现向上)。目前,所有事件都会显示所有日期。

是否可以对event_datetime进行“分组”,以便如果某个事件说是36个小时,那么我可以为该事件选择24小时/ 30个小时的观看次数? 例如对于有趣的2018年,24小时视图将是日期为2018年1月1日的任何内容,30小时视图将是日期为2018年1月1日的所有内容,以及2018年1月2日的前6小时。

我在Mac版本16.14.1上使用Microsoft Excel。如果我可以在原始数据本身中进行结构更改,从而使上述1/2在枢轴中更简单,请告诉我,我可以编辑生成此数据的SQL。

1 个答案:

答案 0 :(得分:0)

有没有一种方法可以使显示在过滤器下拉列表中的日期取决于所选的event_name?否。但是尝试使用切片器...它们可以为您提供一种您所追求的效果,在切片器的顶部会显示“可选”的内容。您可能需要尝试这些设置。

有没有一种方法可以将[event_datetime]分组(按时间)?是的,但是这将需要您在数据中添加另一列来显示时间的流逝,然后,您才能在该字段上设置一个小于过滤器。但是,因为这仅适用于行字段,所以您需要使用第二个隐藏的数据透视表和切片器的变通办法才能使其正常工作。我在本网站的某个地方有一个答案,我将在今天晚些时候尝试找到并链接到它。

鉴于您的要求,我认为您应该只使用一个简单的表(而不是数据透视表)来过滤和显示此数据。希望您拥有的Mac版本允许您像最新版本的Excel一样将切片器放在表上。

您可以通过添加几个新列和几个参数单元格来处理时间分组要求,如下所示:

enter image description here

已分别为橙色单元格分配了DayOfInterest和HoursWithin的命名范围。

经过的时间:=[@[ event_datetime ]]-DayOfInterest

时间分组:=AND([@[Time Elapsed]]>0,[@[Time Elapsed]]<HoursWitthin/24)

这使您可以将“小时数”中的参数设置为所需的任何值(24、36、48),然后使“时间分组”公式显示“真/假”,然后可以对其进行过滤。

通过一点VBA,您还可以使其更加动态...即您可以在有人更改橙色的输入单元格时自动应用过滤器。您只需要将此VBA添加到与其所在的工作表相对应的工作表模块即可。

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [DayOfInterest]) Is Nothing _
Or Not Intersect(Target, [HoursWithin]) Is Nothing Then
     Application.ScreenUpdating = False
     With ActiveWorkbook.SlicerCaches("Slicer_Time_Groupings")
        .ClearAllFilters
        On Error Resume Next
        .SlicerItems("TRUE").Selected = True
        .SlicerItems("FALSE").Selected = False
        On Error GoTo 0
    End With
    Application.ScreenUpdating = True
End If


End Sub