目的:我试图让两列之间的差异%,但我认为问题出在列的类型。
现状:我有两个栏我必须计算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 |
+-----------------+--------------------+--------------------+------------------+
奖金:有没有一种方法来获得差异%在我的子查询,这样我不创建一个子查询????
这应该为您提供一个答案,“奖金”。请注意我在为远低于尽管其他意见:
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);