[英]Sql Union a number of tables together
我正在尝试使用联合会从4个不同的表中获取总数,但是我不确定如何使它工作。
我的单表计数代码很好用,
SELECT (Select count(*)
FROM (SELECT RN, DP, DT, Min(ED) AS MinDate
FROM ECount1
GROUP BY RN, DP, DT) as x
WHERE DT = 'STR'
AND MONTH(MinDate) >= '07'
AND Month(MinDate) <= '09') as StrAFT
我以为我可以加一个工会,但这行不通吗? 像这样吗
SELECT (Select count(*) FROM
(SELECT RN, DP, DT, Min(ED) AS MinDate FROM ECount1 GROUP BY RN, DP, DT) as x WHERE DT = 'STR' AND MONTH(MinDate) >= '07' and Month(MinDate) <= '09'
UNION
SELECT RN, DP, DT, Min(ED) AS MinDate FROM ECount2 GROUP BY RN, DP, DT) as x WHERE DT = 'STR' AND MONTH(MinDate) >= '07' and Month(MinDate) <= '09'
UNION
SELECT RN, DP, DT, Min(ED) AS MinDate FROM ECount3 GROUP BY RN, DP, DT) as x WHERE DT = 'STR' AND MONTH(MinDate) >= '07' and Month(MinDate) <= '09'
UNION
SELECT RN, DP, DT, Min(ED) AS MinDate FROM ECount4 GROUP BY RN, DP, DT) as x WHERE DT = 'STR' AND MONTH(MinDate) >= '07' and Month(MinDate) <= '09'
) as StrAFT
我相信您遇到的问题是UNION
,它将删除重复的行
您可以使用UNION ALL
保留这些重复的行
Select count(*) FROM
(
SELECT RN, DP, DT, Min(ED) AS MinDate FROM ECount1 GROUP BY RN, DP, DT) as x WHERE DT = 'STR' AND MONTH(MinDate) >= '07' and Month(MinDate) <= '09'
UNION ALL
SELECT RN, DP, DT, Min(ED) AS MinDate FROM ECount2 GROUP BY RN, DP, DT) as x WHERE DT = 'STR' AND MONTH(MinDate) >= '07' and Month(MinDate) <= '09'
UNION ALL
SELECT RN, DP, DT, Min(ED) AS MinDate FROM ECount3 GROUP BY RN, DP, DT) as x WHERE DT = 'STR' AND MONTH(MinDate) >= '07' and Month(MinDate) <= '09'
UNION ALL
SELECT RN, DP, DT, Min(ED) AS MinDate FROM ECount4 GROUP BY RN, DP, DT) as x WHERE DT = 'STR' AND MONTH(MinDate) >= '07' and Month(MinDate) <= '09'
) as StrAFT
简化案例
-- This will return 1 row with 1
SELECT 1 UNION SELECT 1
-- This will return 2 rows with 1
SELECT 1 UNION ALL SELECT 1
根据e_i_pi的建议,您可以删除第一个SELECT ()
,它在您的查询中什么也没有做
如建议给Prissioner使用UNION ALL
WITH cte as (
SELECT * FROM ECount1
UNION ALL
SELECT * FROM ECount2
UNION ALL
SELECT * FROM ECount3
UNION ALL
SELECT * FROM ECount4
), calculate as (
SELECT RN, DP, DT, Min(ED) AS MinDate
FROM cte
WHERE DT = 'STR'
AND MONTH(ED) >= '07'
AND MONTH(ED) <= '09
GROUP BY RN, DP, DT
HAVING MIN(ED) IS NOT NULL
)
SELECT COUNT(*)
FROM calculate
对于每个月的计数,请使用GROUP BY
SELECT MONTH(ED), COUNT(*)
FROM calculate
GROUP BY MONTH(ED)
或使用条件计数:
SELECT COUNT(*),
COUNT (CASE WHEN MONTH(ED) = '07' THEN 1 END) as count_07,
COUNT (CASE WHEN MONTH(ED) = '08' THEN 1 END) as count_08,
COUNT (CASE WHEN MONTH(ED) = '09' THEN 1 END) as count_09
FROM calculate
GROUP BY MONTH(ED)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.