我正在尝试如何查找列中是否存在其他值为“0”的情况 MSSQL server 2005表有40列,730行和数字数据。
表格中的数据示例:
date|col1 |col2 |col3 | col4|
1 | 0 | 0 | 0 | 0 |
2 | 45 | 0 | 7 | 0 |
3 | 0 | 0 | 0 | 0 |
4 | 75 | 0 | 0 | 0 |
5 | 0 | 0 | 0 | 0 |
6 | 7 | 0 | 0 | 0 |
7 | 0 | 0 | 7 | 0 |
8 | 0 | 0 | 7 | 0 |
9 | 0 | 0 | 7 | 0 |
结果我需要的是一行布尔值,
其中0
表示列中的所有记录都是值为“0”的记录
并且1
表示列中至少存在除“0”以外的其他值的一倍
结果可以存储在临时表中。
我需要这样的东西:
| col1 | col2 | col3 | col4 |
| 1 | 0 | 1 | 0 |
我该怎么办?有人可以帮忙吗?
我尝试了这个查询:
SELECT
CASE
WHEN max(col1) = 0
THEN 0
ELSE 1
END as col1,
CASE
WHEN max(col2) = 0
THEN 0
ELSE 1
END as col2,
CASE
WHEN max(col3) = 0
THEN 0
ELSE 1
END as col3,
CASE
WHEN max(col4) = 0
THEN 0
ELSE 1
END as col4
FROM table
它工作正常,但似乎非常复杂。任何人都可以建议 别的什么?
答案 0 :(得分:0)
如果您不想列出所有40列,可以使用动态SQL:
git checkout
结果:
DECLARE @SQL varchar(8000)
SET @SQL = 'SELECT '
SELECT @SQL = @SQL + 'CASE WHEN MAX('+ COLUMN_NAME +') = 0 THEN 0 ELSE 1 END As '+ COLUMN_NAME +','
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'T'
SET @SQL = LEFT(@SQL, LEN(@SQL) - 1) + ' FROM T'
EXEC(@SQL)
答案 1 :(得分:0)
我做你做过的事,但也有其他选择......
ISNULL(MAX(NULLIF(col1, 0)), 0)
那个依赖于没有NULL值(或者NULL可以被视为0。
这是我能想到的最短的健壮版本......
MAX(CASE Col1 WHEN 0 THEN 0 ELSE 1 END)