在一张表中获得多个sql结果

时间:2018-12-14 08:17:49

标签: sql sql-server

对于统计数据,我想获取每个航空公司代码每月有效的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月的输出等等。

我将如何做到这一点?

背景:

在我们的数据库中,我们有两个表AppUserUserInAppPurchase

用户表中可能有也可能没有inapp购买。用户在此处可能还会有多个条目。

重要的列是AppUser.AirlineCodeUserInAppPurchase.ValidToUserInAppPurchase.PurchaseDate

正如我所说,AppUser可能有多个表项或根本没有。我想检查一个AppUser是否至少有一个有效的inapp购买大于x月份,然后每月对每个AirlineCode进行总计。

  • x轴:AirlineCode
  • y轴:一年中的月份

我们正在使用mssql

2 个答案:

答案 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