我应该首先说我非常喜欢这个。
我正在尝试编写一个sql查询来提供以下内容:
日期/身份证/姓名/门票/金额/首次出现
19/05/2016 / BFDFRE002 / J.Smith / 2 /£15 / 10/10/2014
我可以很容易地获得所有信息,除了第一次展示EVER。我在我的查询中使用日期参数,因为我正在寻找为特定节目购买门票的人 - 但是这个参数也用于我的第一个节目列,而我希望它是他们的第一个节目的日期时间开始了(即没有日期参数)!
我的查询是:
SELECT EventDate, CustomerID, dcName,
dshowName, Count(TransactNum) AS tickets, Sum(ItemPrice) as Amount,
MIN(EventDate) AS First_Show
FROM Dwh.DimEvents LEFT OUTER JOIN
Dwh.DimShows LEFT OUTER JOIN
Dwh.DimShowTypes ON Dwh.DimShows.dshShowTypeGuid = Dwh.DimShowTypes.dstGuid ON
Dwh.DimEvents.devShowGuid = Dwh.DimShows.dshGuid RIGHT OUTER JOIN
Dwh.DimClients RIGHT OUTER JOIN
Dwh.FactTickets ON Dwh.DimClients.dcClientGUID = Dwh.FactTickets.ftClientGuid ON Dwh.DimEvents.devGuid = Dwh.FactTickets.ftEventGuid
WHERE (EventDate > CONVERT(DATETIME, '2016-05-17 00:00:00', 102))
Group by EventlDate, CustomerID, dcName, dshName
我认为我需要有一个子查询,但我不能有2个选择查询,所以现在我有点卡住了。
我的最终目标是有一个专栏,告诉我第一个节目日期是否在事件日期之前,这意味着这不是他们的第一次(或者相反,如果首次显示日期=事件日期,那么他们是第一次参加者) - 但我最初认为这将是第一步
非常感谢任何帮助!
沃尔夫冈。
答案 0 :(得分:0)
使用CROSS APPLY
分别拉入第一个事件日期,例如下面的示例,基于上面不使用子查询的注释将需要修改以匹配。我们还假设CustomerID
来自Dwh.DimClients
,并且已将表格中的c
别名从交叉申请中提交。
SELECT EventDate ,
CustomerID ,
dcName ,
dshowName ,
COUNT(TransactNum) AS tickets ,
SUM(ItemPrice) AS Amount ,
f.FirstEventDate AS First_Show
FROM Dwh.DimEvents
LEFT OUTER JOIN Dwh.DimShows
LEFT OUTER JOIN Dwh.DimShowTypes ON Dwh.DimShows.dshShowTypeGuid = Dwh.DimShowTypes.dstGuid ON Dwh.DimEvents.devShowGuid = Dwh.DimShows.dshGuid
RIGHT OUTER JOIN Dwh.DimClients C
RIGHT OUTER JOIN Dwh.FactTickets ON Dwh.DimClients.dcClientGUID = Dwh.FactTickets.ftClientGuid ON Dwh.DimEvents.devGuid = Dwh.FactTickets.ftEventGuid
CROSS APPLY ( SELECT MIN(EventDate) FirstEventDate
FROM Dwh.DimEvents
LEFT OUTER JOIN Dwh.DimShows
LEFT OUTER JOIN Dwh.DimShowTypes ON Dwh.DimShows.dshShowTypeGuid = Dwh.DimShowTypes.dstGuid ON Dwh.DimEvents.devShowGuid = Dwh.DimShows.dshGuid
RIGHT OUTER JOIN Dwh.DimClients
RIGHT OUTER JOIN Dwh.FactTickets ON Dwh.DimClients.dcClientGUID = Dwh.FactTickets.ftClientGuid ON Dwh.DimEvents.devGuid = Dwh.FactTickets.ftEventGuid
WHERE CustomerID = C.CustomerID
) f
WHERE ( EventDate > CONVERT(DATETIME, '2016-05-17 00:00:00', 102) )
GROUP BY EventlDate ,
CustomerID ,
dcName ,
dshName;