我试图基于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
非常感谢任何想法或代码示例。
答案 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)
在这种情况下(仅处理YES
和NO
值),简单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];
答案 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