[英]Sql Union a number of tables together
I'm trying to get the total count from 4 different tables using the union but i'm not sure how to get this to work.. 我正在尝试使用联合会从4个不同的表中获取总数,但是我不确定如何使它工作。
My code for the single table count which works fine, 我的单表计数代码很好用,
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
i thought i could just add a union but this doesn't work? 我以为我可以加一个工会,但这行不通吗? Something like this?
像这样吗
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
I believe the problem you have is UNION
, it will remove duplicate rows 我相信您遇到的问题是
UNION
,它将删除重复的行
You can use UNION ALL
to keep those duplicate rows 您可以使用
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
Simplify the case 简化案例
-- 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
As suggested by e_i_pi, you can remove the first SELECT ()
, it done nothing in your query 根据e_i_pi的建议,您可以删除第一个
SELECT ()
,它在您的查询中什么也没有做
As suggested for Prissioner use UNION ALL
如建议给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
For count for each month use GROUP BY
对于每个月的计数,请使用
GROUP BY
SELECT MONTH(ED), COUNT(*)
FROM calculate
GROUP BY MONTH(ED)
OR use conditional count: 或使用条件计数:
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.