T-Sql:将多行转换为一行

时间:2013-04-02 14:14:43

标签: sql sql-server tsql select

如何将这些多行转换为一行? N和Y是bool值。

Id  IsPnt IsPms, IsPdt  
1   N     Y      N  
1   N     Y      N  
1   Y     N      N

进入这个

Id  IsPnt IsPms, IsPdt  
1   Y     Y      N 

编辑:

生成结果集的查询看起来像这样

select b.id, 
    CASE mpft.PlanIndCd WHEN 'PBMN' THEN 1 ELSE 0 END AS IsPnt,
    CASE mpft.PlanIndCd WHEN 'PBMT' THEN 1 ELSE 0 END AS IsPbt,
    CASE mpft.PlanIndCd WHEN 'PBMS' THEN 1 ELSE 0 END AS IsPms
from vw_D_SomveViewName pb
   -- bunch of joins 
where mpft.PlanIndCd in ('HANR', 'PBMN','PBMT','PBMS','HAWR')

4 个答案:

答案 0 :(得分:4)

如果值仅为MAX()Y,则可以对此使用N

SELECT ID, MAX(IsPnt) IsPnt, MAX(IsPms) IsPms, MAX(IsPdt) IsPdt
FROM   tableName
GROUP  BY ID

更新1

SELECT  b.id, 
        MAX(CASE mpft.PlanIndCd WHEN 'PBMN' THEN 1 ELSE 0 END) AS IsPnt,
        MAX(CASE mpft.PlanIndCd WHEN 'PBMT' THEN 1 ELSE 0 END) AS IsPbt,
        MAX(CASE mpft.PlanIndCd WHEN 'PBMS' THEN 1 ELSE 0 END) AS IsPms
FROM    vw_D_SomveViewName pb
        -- bunch of joins 
WHERE   mpft.PlanIndCd in ('HANR', 'PBMN','PBMT','PBMS','HAWR')
GROUP   BY b.ID

答案 1 :(得分:1)

这会有用吗?

select
  id,
  max(IsPnt),
  max(IsPms),
  max(IsPdt)
from
  table
GROUP BY
  id

答案 2 :(得分:0)

编辑问题后,您可以直接使用PIVOT表格运算符,而不是使用MAX表达式,例如:

SELECT
  Id,
  PBMN AS IsPnt,
  PBMT AS IsPbt,
  PBMS AS IsPms
FROM
(
   SELECT
     id,
     mpft.PlanIndCd, 
     ROW_NUMBER() OVER(PARTITION BY id
                       ORDER BY ( SELECT 1)) AS RN
   from vw_D_SomveViewName pb
   -- bunch of joins 
   where mpft.PlanIndCd in ('HANR', 'PBMN','PBMT','PBMS','HAWR')
) AS t
PIVOt
(
   MAX(RN)
   FOR PlanIndCd IN ([PBMN], [PBMT], [PBMS])
) AS p;

您可以在以下演示示例中看到它的实际效果:

Demo on SQL Fiddle

答案 3 :(得分:-5)

select Id, MAX(IPnt), MAX(IsPms), MAX(IsPdt) 
from table etc