J'ai deux questions qui font le travail pour moi, mais j'aimerais les combiner pour avoir les résultats dans une table au lieu de copier les résultats dans Excel.
première requête me donne le nombre d'utilisateurs dont le nombre d'utilisateurs dont Au moins un abonnement a expiré par mois en 2018: P>
WITH UniqueUsers AS
(
SELECT DISTINCT MONTH(PurchaseDate) PurchaseMonth, UserId
FROM UserInAppPurchase
WHERE YEAR(PurchaseDate) = 2018
)
SELECT PurchaseMonth, COUNT(UserId) UserCount
FROM UniqueUsers
GROUP BY PurchaseMonth order by PurchaseMonth;
4 Réponses :
Vous êtes ici, vous pouvez rejoindre CTES
;WITH UniqueUsers1
AS (
SELECT DISTINCT MONTH(ValidTo) ExpireMonth
,UserId
FROM UserInAppPurchase
WHERE YEAR(ValidTo) = 2018
)
,UniqueUsers2
AS (
SELECT DISTINCT MONTH(PurchaseDate) PurchaseMonth
,UserId
FROM UserInAppPurchase
WHERE YEAR(PurchaseDate) = 2018
)
SELECT *
FROM (
SELECT ExpireMonth
,COUNT(UserId) UserCount
FROM UniqueUsers1 c1
GROUP BY ExpireMonth
) First
INNER JOIN (
SELECT PurchaseMonth
,COUNT(UserId) UserCount
FROM UniqueUsers2
GROUP BY PurchaseMonth
) Sec ON First.ExpireMonth = Sec.PurchaseMonth
Supposons donc que je voudrais le faire pour 2019. Là, j'ai des valeurs dans l'expirememonth mais pas à la fin de l'achat, car aucun achat n'a encore été fait. Maintenant, lors du remplacement de 2018 avec 2019, les résultats ne montrant que janvier et février car la liste achetée n'a pas encore de données. Mais comment puis-je forcer tous les 12 mois? Alors, quand rien n'est à compter à l'acheteur, il suffit de montrer 0?
Cette requête utilise une jointure interne, cela signifie au cas où la mise au point de l'après -emonth et l'expirememonth diffère (par exemple, il y a 1 comme acheteur et no 1 comme expiremememonth) la requête de résultat ne contiendra pas 1
Vous pouvez stocker chaque résultat dans une table temporaire distincte, par exemple, créez deux tables temporaires telles que ceci:
MonthNumber UsersMadePurchases ExpireMonth UsersExpiredSubs 4 1 NULL NULL 5 2 5 2 6 2 6 2 7 1 7 1 8 1 8 1
Vous pouvez utiliser smth comme ceci: mais je ne suis pas sûr que votre commander par code> clause est ce que vous voulez. Vos mois seront triés comme 1, 11, 12. Peut-être que vous vouliez peut-être une autre commande, je viens de réécrire vos requêtes afin de les combiner. P> p>
J'agiterais les dates et j'agecte simplement:
SELECT MONTH(dte) as mon,
COUNT(DISTINCT ExpireUserId) as numExpiredUsers,
COUNT(DISTINCT PurchaseUserId) as numPurchaseUsers
FROM UserInAppPurchase uiap CROSS APPLY
(VALUES (ValidTo, UserId, NULL),
(PurchaseDate, NULL, UserId)
) v(dte, ExpireUserId, PurchaseUserId)
WHERE dte >= '2018-01-01' AND dte < '2019-01-01'
GROUP BY MONTH(dte)
ORDER BY MONTH(dte);
Quelle est votre sortie attendue
édité mon post avec ma sortie attendue