Попытка разделить две колонки, чтобы получить процент, но дает мне 0 - PullRequest
0 голосов
/ 08 февраля 2019

Цель: Я пытаюсь получить разницу в% между двумя столбцами, но я думаю, что проблема заключается в типе в столбце.

Ситуация: Iу меня есть два столбца, я должен сосчитать NON NULL случаев, чтобы узнать, сколько раз что-то происходит в каждом месяце.И я хочу получить разницу в% между этими двумя столбцами.

Запрос:

SELECT *
    ,subquery3.[Email Logins Week2]/subquery3.[Email Logins Week1]
FROM    (
        SELECT  
             FORMAT(tbl3.Creation_Date, 'yyyyMM')       AS [Date Subscribed]
            ,CAST(COUNT(CASE WHEN t1.Emails IS NOT NULL THEN 1 ELSE NULL END) AS int)   AS [Email Logins Week1]
            ,CAST(COUNT(CASE WHEN t2.Emails IS NOT NULL THEN 1 ELSE NULL END) AS int)   AS [Email Logins Week2]
        FROM #tbl1 t1
        LEFT JOIN #tbl2 t2
            ON t1.Emails=t2.Emails
        INNER JOIN #tbl3 t3
            ON t1.Emails=t3.email
        GROUP BY FORMAT(t3.Creation_Date, 'yyyyMM')
        ) subquery3

Это дает мне что-то вроде этого:

+-----------------+--------------------+--------------------+------------------+
| Date Subscribed | Email Logins Week1 | Email Logins Week2 | (No column name) |
+-----------------+--------------------+--------------------+------------------+
|          201801 |               6800 |               2000 |                0 |
|          201802 |               9000 |               3000 |                0 |
|          201803 |               7000 |               2500 |                0 |
|          201804 |               7200 |               2400 |                0 |
+-----------------+--------------------+--------------------+------------------+

Вместо:

+-----------------+--------------------+--------------------+------------------+
| Date Subscribed | Email Logins Week1 | Email Logins Week2 | (No column name) |
+-----------------+--------------------+--------------------+------------------+
|          201801 |               6800 |               2000 |      0.294117647 |
|          201802 |               9000 |               3000 |      0.333333333 |
|          201803 |               7000 |               2500 |      0.357142857 |
|          201804 |               7200 |               2400 |      0.333333333 |
+-----------------+--------------------+--------------------+------------------+

Бонус: Есть ли способ получить разницу в% в моем подзапросе, чтобы я не создавал подзапрос ????

1 Ответ

0 голосов
/ 08 февраля 2019

Это должно дать вам ответ на «бонус».обратите внимание и на другие мои комментарии ниже:

SELECT LEFT(CONVERT(varchar(8),t3.Creation_Date,112),6) AS [Date Subscribed], --FORMAT performs poorly, this'll be faster
       COUNT(CASE WHEN t1.Emails IS NOT NULL THEN 1 END) AS [Email Logins Week1], --COUNT already returns an int
       COUNT(CASE WHEN t2.Emails IS NOT NULL THEN 1 END) AS [Email Logins Week2], --I've also removed the ELSE NULL as a CASE expression that doesn't resolve returns NULL
       COUNT(CASE WHEN t1.Emails IS NOT NULL THEN 1 END) / (COUNT(CASE WHEN t2.Emails IS NOT NULL THEN 1 END) * 1.0) AS OtherColumn
FROM #tbl1 t1
     LEFT JOIN #tbl2 t2 ON t1.Emails = t2.Emails
     INNER JOIN #tbl3 t3 ON t1.Emails = t3.email
GROUP BY LEFT(CONVERT(varchar(8),t3.Creation_Date,112),6);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...