繁体   English   中英

如何将两个或多个 SQL 查询的结果合并为一行?

[英]How to combine results of two or more SQL queries in one row?

我有一张桌子“BIRTH_ENTRY”和“DEATH_ENTRY”。 两者都包含 ENTRY_DATE、SEX_ID 字段。

SEX_ID = 1 (MALE) & SEX_ID = 2 (FEMALE)

我想计算为出生和死亡 GROUP & ORDER BY MONTH(ENTRY_DATE) 完成的男性、女性和总计(男性 + 女性)条目的数量

例如

|Month|Born_Male|Born_Female|Total_Born|Died_Male|Died_Female|Total_Died|
|  1  |
|  2  |
|  3  |
|  4  |
|  5  |
|  6  |
|  7  |
|  8  |
|  9  |
| 10  |
| 11  |
| 12  |

我用过这个 SQL:

SELECT 
    (*Query to select born Male*),
    (*Query to select born Female*),
    (*Query to select total born*),
    (*Query to select died Male*),
    (*Query to select died Female*),
    (*Query to select total died*)

SELECT 
    (SELECT COUNT(SEX_ID) AS Expr1 
     FROM BIRTH_ENTRY 
     WHERE MONTH(ENTRY_DATE) = 1 AND (SEX_ID = 1) 
     GROUP BY MONTH(ENTRY_DATE)) AS Birth_Male_Count,
    (SELECT COUNT(SEX_ID) AS Expr1 
     FROM BIRTH_ENTRY AS BIRTH_ENTRY_1 
     WHERE MONTH(ENTRY_DATE) = 1 AND (SEX_ID = 2) 
     GROUP BY MONTH(ENTRY_DATE)) AS Birth_Female_Count,
    (SELECT COUNT(SEX_ID) AS Expr1 
     FROM BIRTH_ENTRY AS BIRTH_ENTRY_2 
     WHERE MONTH(ENTRY_DATE) = 1 
     GROUP BY MONTH(ENTRY_DATE)) AS Birth_Total_Count,
    (SELECT COUNT(SEX_ID) AS Expr1 
     FROM DEATH_ENTRY 
     WHERE MONTH(ENTRY_DATE) = 1 AND (SEX_ID = 1) 
     GROUP BY MONTH(ENTRY_DATE)) AS Death_Male_Count,
    (SELECT COUNT(SEX_ID) AS Expr1 
     FROM DEATH_ENTRY AS DEATH_ENTRY_1 
     WHERE MONTH(ENTRY_DATE) = 1 AND (SEX_ID = 2) 
     GROUP BY MONTH(ENTRY_DATE)) AS Death_Female_Count,
    (SELECT COUNT(SEX_ID) AS Expr1 
     FROM DEATH_ENTRY AS DEATH_ENTRY_2 
     WHERE MONTH(ENTRY_DATE) = 1 
     GROUP BY MONTH(ENTRY_DATE)) AS Death_Total_Count

但如您所知,此查询将仅返回一行。 所以,我必须在所有 12 个月内写 12 次。 嗯,这还不够好。

所以,请帮帮我。

提前致谢!

我让这个查询使用一个非常小的数据池工作。 您必须对其进行测试,以查看它是否完全符合您的要求。

我使用的表格格式...

dbo.BIRTH - ENTRY (datetime), ID (int)
dbo.DEATH - ENTRY (datetime), ID (int)


;with cte (MONTH) AS (

    SELECT 1
    UNION ALL
    SELECT MONTH + 1 FROM cte WHERE MONTH < 12
)
SELECT c.MONTH
       , COUNT(CASE WHEN b.ID = 1 THEN 1 END) AS MALEBIRTH
       , COUNT(CASE WHEN b.ID = 2 THEN 1 END) AS FEMALEBIRTH
       , COUNT(CASE WHEN b.ID = 1 OR b.ID = 2 THEN 1 END) AS TOTALBIRTH
       , (SELECT COUNT(CASE WHEN d.ID = 1 THEN 1 END) FROM DEATH d WHERE DATEPART(mm, d.ENTRY) = c.MONTH) AS MALEDEATH
       , (SELECT COUNT(CASE WHEN d.ID = 2 THEN 2 END) FROM DEATH d WHERE DATEPART(mm, d.ENTRY) = c.MONTH) AS FEMALEDEATH
       , (SELECT COUNT(CASE WHEN d.ID = 1 OR d.ID = 2 THEN 2 END) FROM DEATH d WHERE DATEPART(mm, d.ENTRY) = c.MONTH) AS TOTALDEATH
FROM BIRTH b FULL OUTER JOIN cte c ON DATEPART(mm, b.ENTRY) = c.MONTH 
     GROUP BY c.MONTH

这每个月都会显示(无论上面是否有任何东西)。 它还显示您想要的所有信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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