从三张表中提取数据,一张表作为中间

Posted

技术标签:

【中文标题】从三张表中提取数据,一张表作为中间【英文标题】:extract data from three table with one table act as intermediate 【发布时间】:2014-08-26 11:47:16 【问题描述】:

请在这种情况下帮助我。

我想要的输出应该显示在下面的表格示例中。

点击here

对于第一个单元格,我需要显示已完成 HIV 过滤且年龄小于 19 岁的男性。 下一个单元格也是如此,我需要显示已经完成 HIV 过滤且她小于 19 岁的女性,并且下一行的不同年龄组也是如此。 性别和年龄组在表 DONOR_MST 中,列 GENDER 和 DOB 已过滤 HIV 的患者总数在 BAT_TESDET 表的 RES_HIV 列中 但是,这两个表没有任何匹配的主键。

然后我确实得到了一个表名 PRE_SCREEN,其中包含 DONOR_MST 和 BAT_TESDET 中的匹配列

下面是每张桌子的PK:

具有 DONOR_ID 列的表 DONOR_MST 表 BAT_TESDET,列 DISP_ID 和 BARCODE 具有 DONOR_ID 列和 BARCODE 列的 PRE_SCREEN 表

我确实尝试过使用 INNER JOIN,但它没有用。下面是我的代码

     SELECT 
     (CASE c.GENDER WHEN '1' THEN 1 ELSE 0 END) AS MALE,
     (CASE c.GENDER WHEN '2' THEN 1 ELSE 0 END) AS FEMALE,
     (CASE  WHEN (datediff(YEAR, c.DOB, getdate()))  < 19 THEN 1 ELSE 0 END ) 
     (CASE  WHEN (datediff(YEAR, c.DOB, getdate()))  BETWEEN 20 AND 24 THEN 1 ELSE 0 END ) 
     (CASE  WHEN (datediff(YEAR, c.DOB, getdate()))  BETWEEN 25 AND 29 THEN 1 ELSE 0 END ) 
     (CASE  WHEN (datediff(YEAR, c.DOB, getdate()))  BETWEEN 30 AND 34 THEN 1 ELSE 0 END ) 
     (CASE  WHEN (datediff(YEAR, c.DOB, getdate()))  BETWEEN 35 AND 39 THEN 1 ELSE 0 END ) 
     (CASE  WHEN (datediff(YEAR, c.DOB, getdate()))  BETWEEN 40 AND 44 THEN 1 ELSE 0 END ) 
     (CASE  WHEN (datediff(YEAR, c.DOB, getdate()))  BETWEEN 45 AND 49 THEN 1 ELSE 0 END ) 
     (CASE  WHEN (datediff(YEAR, c.DOB, getdate()))  BETWEEN 50 AND 54 THEN 1 ELSE 0 END ) 
     (CASE  WHEN (datediff(YEAR, c.DOB, getdate()))  > 55 THEN 1  ELSE 0 END ) 

    FROM  dbo.DONOR_MST c
    INNER JOIN dbo.PRE_SCREEN b
            ON c.DONOR_ID LIKE b.DONOR_ID
            INNER JOIN BAT_TESDET a
            ON b.BARCODE = a.BARCODE 
    WHERE 
    b.IS_ELIGIBLE = '1'
        AND b.SCR_DATE >= @STARTDATE
        AND b.SCR_DATE <= @ENDDATE  

我的问题:

如何链接三个表

【问题讨论】:

你尝试过 INNER JOIN 吗? @Bulat,是的,我确实尝试过 INNER JOIN,但它没有用。 能否将您尝试的查询添加到问题中 @Bulat 已经添加了查询:) 为什么在join语句中使用LIKE?还有什么不起作用,您是否收到错误消息或没有得到您期望的结果? 【参考方案1】:

为了得到这些信息,这里是一个查询命题:

SELECT D.DOB
,SUM(CASE
WHEN D.GENDER = 'MALE' THEN 1
ELSE 0
END) AS [MALE]
,SUM(CASE
WHEN D.GENDER = 'FEMALE' THEN 1
ELSE 0
END) AS [FEMALE]
,COUNT(*) AS [TOTAL]
FROM DONOR_MST D
INNER JOIN PRE_SCREEN P ON P.DONOR_ID = D.DONOR_ID
INNER JOIN BAT_TESDET B ON B.BARCODE = P.BARCODE
GROUP BY D.DOB

希望这会对你有所帮助。

【讨论】:

以上是关于从三张表中提取数据,一张表作为中间的主要内容,如果未能解决你的问题,请参考以下文章

怎样用Sql语句判断一张表中的两条数据相同

如何用标准SQL语句给一张表中添加多个字段

如果ID存在于第二张或第三张表中,如何从第一张表中高效选择?

怎样用Sql语句判断一张表中的两条数据相同

mysql数据迁移

hive sql 将两张表连接成为第三张表