【问题标题】:How to combine results of two or more SQL queries in one row?如何将两个或多个 SQL 查询的结果合并到一行中?
【发布时间】:2016-09-09 23:37:35
【问题描述】:

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

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

我想计算为 Birth & Death 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 次。好吧,这还不够好。

所以,请帮帮我。

提前致谢!

【问题讨论】:

  • 您使用的是什么 DBMS,您的两个表 (BIRTH_ENTRY, DEATH_ENTRY) 是什么样的?只有ENTRY_DATE and SEX_ID吗?
  • 你可以使用 over partition by 来解决这个问题。
  • 我使用的是 SQL Server 2012,表是:BIRTH_ENTRY (ENTRY_DATE,SEX_ID) & DEATH_ENTRY(ENTRY_DATE,SEX_ID) @Cody360c
  • @KevalPandya 是 ENTRY_DATE 日期时间吗?
  • 对不起,如果这很明显,但我不知道你在说什么。我不明白。 @海盗

标签: sql sql-server-2012


【解决方案1】:

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

我使用的表格格式...

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

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

【讨论】:

  • 太棒了。感谢帮助。它完美地工作。 ^_^
  • @KevalPandya 没问题!很高兴我能帮忙:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 2013-07-25
  • 2021-09-06
  • 2020-07-19
相关资源
最近更新 更多