对于统计数据,我想获取每个航空公司代码每月有效的inapp购买数量。我已经有一个月的查询了:
SELECT
AirlineCode,
COUNT(DISTINCT AppUser.Id) AppUser
FROM [followme.aero.live].[dbo].[AppUser]
JOIN [followme.aero.live].[dbo].[UserInAppPurchase]
ON AppUser.Id = UserInAppPurchase.UserId
WHERE ValidTo > '2018-01-01' AND PurchaseDate < '2018-01-01'
GROUP BY AirlineCode
ORDER BY AppUser DESC;
那会给我一月份的数据。我想得到的是在一个表中不仅是1月的输出,而且是2018年2月,3月的输出等等。
我将如何做到这一点?
背景:
在我们的数据库中,我们有两个表AppUser
和UserInAppPurchase
。
用户表中可能有也可能没有inapp购买。用户在此处可能还会有多个条目。
重要的列是AppUser.AirlineCode
,UserInAppPurchase.ValidTo
和UserInAppPurchase.PurchaseDate
。
正如我所说,AppUser
可能有多个表项或根本没有。我想检查一个AppUser
是否至少有一个有效的inapp购买大于x月份,然后每月对每个AirlineCode
进行总计。
AirlineCode
我们正在使用mssql
答案 0 :(得分:1)
由于每次购买可能是针对不同月份计算的,因此您不能简单地GROUP BY
,就必须以某种方式乘以每个月适用于分组之前的每个记录。
您可以使用CTE生成月份参考日期,然后针对这些日期进行合并。请注意,我添加了每个月的年份,如果不需要,则可以省略(或者仅生成直到2018-12-01的月份)。
;WITH MonthsStartDates AS
(
SELECT
MonthStartDate = CONVERT(DATE, '2018-01-01')
UNION ALL
SELECT
MonthStartDate = DATEADD(MONTH, 1, M.MonthStartDate)
FROM
MonthsStartDates AS M
WHERE
M.MonthStartDate <= '2020-01-01'
)
SELECT
AirlineCode,
Year = DATEPART(YEAR, M.MonthStartDate),
Month = DATEPART(MONTH, M.MonthStartDate),
AppUser = COUNT(DISTINCT AppUser.Id)
FROM
[followme.aero.live].[dbo].[AppUser]
INNER JOIN [followme.aero.live].[dbo].[UserInAppPurchase] ON AppUser.Id = UserInAppPurchase.UserId
INNER JOIN MonthsStartDates AS M ON
PurchaseDate < M.MonthStartDate AND
ValidTo > M.MonthStartDate
GROUP BY
AirlineCode,
DATEPART(YEAR, M.MonthStartDate),
DATEPART(MONTH, M.MonthStartDate)
答案 1 :(得分:0)
为<select formControlName="store" class="form-control form-control-sm">
<option value="np">Nepal</option>
<option value="in">India</option>
<option value="pk">Pakistan</option>
<option value="ch">China</option>
</select>
添加YEAR()
和MONTH()
并将它们添加到PurchaseDate
子句中。如果要查看“ 2018-01-01”中的数据,也请更改PurchaseDate范围。
检查此示例:
GROUP BY