我想帮助添加一个UNION来获取查询的所有月份。我尝试在一堆斑点中添加联合但是却无法正确使用它。
SELECT MONTH(FirstPublishedToPortal) AS theMonth,
YEAR(FirstPublishedToPortal) AS theYear,
MONTHNAME(FirstPublishedToPortal) AS theMonthName,
COUNT(DISTINCT PONum) AS POCount,
SUM(unconfirmedEmailSent) AS unconfirmedEmailsSent,
( SELECT COUNT(DISTINCT PONum)
FROM POFlags
WHERE unconfirmedEmailSent = 0
AND MONTH(FirstPublishedToPortal) = theMonth
AND YEAR(FirstPublishedToPortal) = theYear
AND VendorNum = '2222'
) AS onTimeConfirmed,
SUM(lateEmailSent) AS lateEmailsSent,
( SELECT COUNT(DISTINCT PONum)
FROM POFlags
WHERE lateEmailSent = 0
AND MONTH(FirstPublishedToPortal) = theMonth
AND YEAR(FirstPublishedToPortal) = theYear
AND VendorNum = '2222'
) AS onTimePOCount
FROM POFlags
WHERE VendorNum = '2222'
AND FirstPublishedToPortal >= '2017-01-08'
GROUP BY theYear DESC, theMonth DESC
ORDER BY FirstPublishedToPortal DESC
此查询中的union子句在哪里? 我认为需要有类似下面的代码,但我不明白在哪里使用GROUP BY或ORDER BY正常工作。
(SELECT 1, null, 'January', 0, 0, 0, 0, 0)
UNION
(SELECT 2, null, 'February', 0, 0, 0, 0, 0)
UNION
(SELECT 3, null, 'March', 0, 0, 0, 0, 0)
.
.
(SELECT 12, null, 'December, 0, 0, 0, 0, 0)
答案 0 :(得分:2)
使用基于带联合的嵌套查询的左连接。
使用Coalesce应用默认值。
移动连接子句
的条件警告,2017年是硬编码的
像这样:http://sqlfiddle.com/#!9/458808/27
SELECT
all_month.nMonth AS theMonth,
coalesce(YEAR(FirstPublishedToPortal),2017) AS theYear,
all_month.sMonth AS theMonthName,
coalesce(COUNT(DISTINCT PONum),0) AS POCount,
coalesce(SUM(unconfirmedEmailSent),0) AS unconfirmedEmailsSent,
coalesce(( SELECT COUNT(DISTINCT PONum)
FROM POFlags
WHERE unconfirmedEmailSent = 0
AND MONTH(FirstPublishedToPortal) = theMonth
AND YEAR(FirstPublishedToPortal) = theYear
AND VendorNum = '2222'
),0) AS onTimeConfirmed,
coalesce(SUM(lateEmailSent),0) AS lateEmailsSent,
coalesce(( SELECT COUNT(DISTINCT PONum)
FROM POFlags
WHERE lateEmailSent = 0
AND MONTH(FirstPublishedToPortal) = theMonth
AND YEAR(FirstPublishedToPortal) = theYear
AND VendorNum = '2222'
),0) AS onTimePOCount
FROM (
(SELECT 1 nMonth, 'January' sMonth) UNION ALL
(SELECT 2 nMonth, 'February' sMonth ) UNION ALL
(SELECT 3 nMonth, 'March' sMonth ) UNION ALL
(SELECT 4 nMonth, 'April' sMonth ) UNION ALL
(SELECT 5 nMonth, 'May' sMonth ) UNION ALL
(SELECT 6 nMonth, 'June' sMonth ) UNION ALL
(SELECT 7 nMonth, 'July' sMonth ) UNION ALL
(SELECT 8 nMonth, 'August' sMonth ) UNION ALL
(SELECT 9 nMonth, 'September' sMonth) UNION ALL
(SELECT 10 nMonth, 'October' sMonth ) UNION ALL
(SELECT 11 nMonth, 'November' sMonth )UNION ALL
(SELECT 12 nMonth, 'December' sMonth)
) all_month left join POFlags on
MONTH(FirstPublishedToPortal)=nMonth and
VendorNum = '2222' and
FirstPublishedToPortal >= '2017-01-08'
GROUP BY
theYear DESC, nMonth DESC
ORDER BY
nMonth DESC
使用原始结果和默认值之间的全局联合存在另一种方法,但此方法需要第二组...