sql - 如何在连接案例 SQL Server 上生成 1 行输出

标签 sql sql-server

我的 SQL Server 数据库中有两个表。

电磁脉冲表...

ID NAME A
-- ---- -
01 Tony Y
02 Fred N

和组成员资格表 (GRP)...

ID GRP    START    FINISH   KEYSK
-- ------ -------- -------- -----
01   GRP1 01/01/15 31/01/15 00001
01   GRP2 01/02/15 28/02/15 00002
01   GRP3 01/03/15 30/04/15 00003
01   GRP2 01/15/15 31/12/99 00004
01   GRPA 01/01/15 28/02/15 00005
01   GRPB 01/03/15 31/03/15 00006
01   GRPC 01/14/15 30/04/15 00007
01   GRPB 01/15/15 31/12/99 00008
02  GRPII 01/01/15 28/02/15 00005
02 GRPIII 01/03/15 31/03/15 00006
02  GRPIV 01/14/15 30/04/15 00007
02   GRPV 01/15/15 31/12/99 00008

我正在尝试构建一个查询来生成以下输出,该输出将从上面选择行 00004 和 00008,因为它们的开始日期和结束日期是当前的...

NAME GRP123 GRPABC GRPROMAN
---- ------ ------ --------
Tony   GRP2   GRPB      N/A

但是我的查询返回以下内容...

NAME GRP123 GRPABC GRPROMAN
---- ------ ------ --------
Tony   GRP2    N/A      N/A
Tony    N/A   GRPB      N/A

这是我尝试的查询,我可能会遇到复杂的事情......

    select NAME, 
           "GRP123" = case 
                          when GRP123.GRP='GRP1' then 'GRP1' 
                          when GRP123.GRP='GRP2' then 'GRP2' 
                          when GRP123.GRP='GRP3' then 'GRP3' 
                          else 'N/A' end,
           "GRPABC" = case 
                          when GRPABC.GRP='GRP1' then 'GRP1' 
                          when GRPABC.GRP='GRP2' then 'GRP2' 
                          when GRPABC.GRP='GRP3' then 'GRP3' 
                          else 'N/A' end,
           "GRPROMAN" = case 
                          when GRPROMAN.GRP='GRPI' then 'GRPI' 
                          when GRPROMAN.GRP='GRPII' then 'GRPII' 
                          when GRPROMAN.GRP='GRPIII' then 'GRPIII' 
                          when GRPROMAN.GRP='GRPIV' then 'GRPIV' 
                          when GRPROMAN.GRP='GRPV' then 'GRPV' 
                          when GRPROMAN.GRP='GRPVI' then 'GRPVI' 
                          else 'N/A' end,
      from EMP
full outer join GRP as GRP123 on EMP.ID = GRP123.ID and GRP123.GRP in ('GRP1', 'GRP2', 'GRP3')
full outer join GRP as GRPABC on EMP.ID = GRPABC.ID and GRPABC.GRP in ('GRPA', 'GRPB', 'GRPC')
full outer join GRP as GRPROMAN on EMP.ID = GRPROMAN.ID and GRPROMAN.GRP in ('GRPI', 'GRPII', 'GRPIII', 'GRPIV', 'GRPV', 'GRPVI')
     where EMP.A = 'T'
  order by EMP.NAME
;

任何帮助/指导将不胜感激。

可选的改进输出可能是...

NAME GRP123 GRP123START GRPABC GRPABCSTART GRPROMAN GRPROMANSTART
---- ------ ----------- ------ ----------- -------- -------------
Tony   GRP2    01/15/15   GRPB    01/15/15      N/A           N/A

谢谢,AjN3806

最佳答案

您可以在每一列中使用子查询,如下所示:

SELECT
    NAME,
    GRP123 = ISNULL((
        SELECT TOP 1
            GRP
        FROM 
            GRP g
        WHERE 
            GRP IN (
                'GRP1', 'GRP2', 'GRP3')
            AND g.KEYSK IN ('00004', '00008')
            AND e.ID = g.ID 
    ), 'N/A'),
    GRPABC = ISNULL((
        SELECT TOP 1
            GRP
        FROM 
            GRP g
        WHERE 
            GRP IN (
                'GRPA', 'GRPB', 'GRPC')
            AND g.KEYSK IN ('00004', '00008')
            AND e.ID = g.ID 
    ), 'N/A'),
    GRPROMAN = ISNULL((
        SELECT TOP 1
            GRP
        FROM 
            GRP g
        WHERE 
            GRP IN (
                'GRPI', 'GRPII', 'GRPIII', 'GRPIV', 'GRPV', 'GRPVI')
            AND g.KEYSK IN ('00004', '00008')
            AND e.ID = g.ID 
    ), 'N/A')
FROM
    EMP e
WHERE
    e.A = 'Y'
ORDER BY
    e.NAME

关于sql - 如何在连接案例 SQL Server 上生成 1 行输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33908373/

相关文章:

java - 在 Flink SQL Windows 中使用带有延迟的事件时间

mysql - SQL 查询 - 按季度排序是和否

c# - 自动化从一个文件夹中的多个 CSV 文件导出数据的过程

java - 在java中获取数据库连接

sql - 在原始查询中使用双引号和单引号时,Sequelize 会提示 "misuse of aggregate: SUM()"

java - 甲骨文 : Unique constraint violated exception but my data does not actually violate it

sql - 使用 "Merge"语法合并重复记录

sql - 选择 Count Outer Joins 和 WHERE

sql - "Clustered Index Scan (Clustered)"在 SQL Server 执行计划中意味着什么?

sql - 我可以使用过滤索引来查询 "recently modified"行吗