我有多个成员行,并且希望通过优先考虑值'是',基于两列的值合并它们。
Name | Status1 | Status2
Jon | Yes | No
Jon | No | Yes
我希望查询返回
Name | Status1 | Status2
Jon | Yes | Yes
因此,如果该列甚至有一次Yes
,则必须为该人分配Yes
,否则必须为No
。
答案 0 :(得分:4)
以下是用于BigQuery标准SQL
#standardSQL
SELECT Name, MAX(Status1) AS Status1, MAX(Status2) AS Status2
FROM `project.dataset.table`
GROUP BY Name
您可以使用示例数据进行测试
#standardSQL
WITH `project.dataset.table` AS (
SELECT 'Jon' Name, 'Yes' Status1, 'No' Status2 UNION ALL
SELECT 'Jon', 'No', 'Yes'
)
SELECT Name, MAX(Status1) AS Status1, MAX(Status2) AS Status2
FROM `project.dataset.table`
GROUP BY Name
有结果
Row Name Status1 Status2
1 Jon Yes Yes
答案 1 :(得分:0)
除了Mikhail的答案外,我还添加了MsSQL的另一种解决方案。语法可能不同,但逻辑类似:
create table test
(id int , name1 varchar(10), name2 varchar(10))
insert into test values (1,'yes','no')
insert into test values (2,'no','no')
insert into test values (3,'yes','yes')
declare @searchKey varchar(10) = 'yes'
declare @cols varchar(255) = (SELECT STUFF((
SELECT ', ' + c.name
FROM sys.columns c
JOIN sys.types AS t ON c.user_type_id=t.user_type_id
WHERE t.name != 'int' AND t.name != 'bit' AND t.name !='date' AND t.name !='datetime'
AND object_id =(SELECT object_id FROM sys.tables WHERE name='test')
FOR XML PATH('')),1,2,''))
declare @sql nvarchar(max) = 'SELECT * from test where '''+@searchKey+''' in ('+@cols+')'
exec sp_executesql @sql
编辑:请注意,如果任何列都包含特定值,则此解决方案将检查表的所有列。假设OP需要检查100列,直到status100
,那么我相信像这样的动态解决方案会更方便。