简体   繁体   English

SQL联合一些表在一起

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM