将多行与单行组合以获得多列中的唯一值

时间:2017-12-05 06:46:28

标签: sql-server tsql

我试图基于SQL Server 2012中多列上的唯一值来获取唯一行。

来源数据:

UserId ---- P1 ---- P2 ------ P3

101 ------- NO ---- NO -------是

101 ------- NO ---- YES ------ NO

101 -------是----否-------否

102 -------- NO ----- NO ------- NO

我的源数据有'是'在多列的单列中。

我试图得到如下结果:

期望的输出:

UserId ---- P1 ---- P2 ------ P3

101 -------是----是-----是

102 -------- NO ----- NO ------- NO

非常感谢任何想法或代码示例。

3 个答案:

答案 0 :(得分:1)

SQL Server 2012 及更高版本中,您可以使用此结构:

SELECT  UserId,
        IIF(SUM(IIF(P1 = 'YES',1,0)) > 0,'YES','NO') as P1,
        IIF(SUM(IIF(P2 = 'YES',1,0)) > 0,'YES','NO') as P2,
        IIF(SUM(IIF(P3 = 'YES',1,0)) > 0,'YES','NO') as P3
FROM YourTable
GROUP BY UserId

或者,而不是IIF使用CASE SQL Server 2008 或更高版本):

SELECT  UserId,
        CASE WHEN SUM(CASE WHEN P1 = 'YES' THEN 1 ELSE 0 END) > 0 THEN 'YES' ELSE 'NO' END as P1,
        CASE WHEN SUM(CASE WHEN P2 = 'YES' THEN 1 ELSE 0 END) > 0 THEN 'YES' ELSE 'NO' END as P2,
        CASE WHEN SUM(CASE WHEN P3 = 'YES' THEN 1 ELSE 0 END) > 0 THEN 'YES' ELSE 'NO' END as P3
FROM YourTable
GROUP BY UserId

输出:

UserId  P1  P2  P3
101     YES YES YES
102     NO  NO  NO

答案 1 :(得分:1)

在这种情况下(仅处理YESNO值),简单MIN / MAX可以解决任务。

DECLARE @SourceData TABLE
(
    [UserId] INT
   ,[P1] VARCHAR(3)
   ,[P2] VARCHAR(3)
   ,[P3] VARCHAR(3)
);

INSERT INTO @SourceData ([UserId], [P1], [P2], [P3])
VALUES ('101', 'NO', 'NO', 'YES')
      ,('101', 'NO', 'YES', 'NO')
      ,('101', 'YES', 'NO', 'NO')
      ,('102', 'NO', 'NO', 'NO');

SELECT [UserId]
      ,MAX([P1])
      ,MAX([P2])
      ,MAX([P3])
FROM @SourceData
GROUP By [UserId];

enter image description here

答案 2 :(得分:0)

试试这个

WITH CTE
AS
(
   SELECT
      DISTINCT UserId
  FROM T1
)
SELECT
UserId,
P1 = CASE WHEN EXISTS(SELECT 1 FROM T1 WHERE UserId = CTE.UserId AND P1='YES')
THEN 'YES' ELSE 'NO' END,
P2 = CASE WHEN EXISTS(SELECT 1 FROM T1 WHERE UserId = CTE.UserId AND P2='YES')
THEN 'YES' ELSE 'NO' END,
P3  = CASE WHEN EXISTS(SELECT 1 FROM T1 WHERE UserId = CTE.UserId AND P3='YES')
THEN 'YES' ELSE 'NO' END
FROM CTE

注意:假设您的表名为T1

相关问题