我有一个包含大约30列的数据表1列是用户ID,其余的是" items"排名从0到29的值,表示项目中的兴趣金额。 0 =没有兴趣1 =大多数,29 =最少。
是否可以输出所有带有计数的列而无需编写语句或每个项目利用" *"比如
SELECT COUNT(*)
FROM Table t
WHERE * != 0
输出为
Item1 | Item2 | Item3 | Item4 | Item5
xxxxx | xxxxx | xxxxx | xxxxx | xxxxx
xxxxx是列中值不为0的记录总数?
答案 0 :(得分:0)
您可以浏览INFORMATION_SCHEMA并构建一个查询并使用sql函数EXEC()运行它。
将INFORMATION_SCHEMA.TABLES与INFROMATION_SCHEMA.COLUMNS连接在一起。另外,只需要重新使用它就可以使用所需的表名放置变量。您必须按所需的类型列过滤INFORMATION_SCHEMA.COLUMNS(int)
答案 1 :(得分:0)
有一个XML技巧可以在没有显式列枚举的情况下动态规范化数据:
With SampleTab (UserId, Item1, Item2) As (
Select 'A' , 0 , 1 Union All
Select 'B' , 2 , 0 Union All
Select 'C' , 3 , 0
), SampleXML As (
Select CAST((Select * From SampleTab root For XML Auto) AS XML) As Doc
), SampleNormalised As (
Select
NodeName = C.value('local-name(.)', 'varchar(50)'),
NodeValue = C.value('(.)[1]', 'int')
From SampleXML
Cross Apply Doc.nodes('/root/@*') AS T(C)
)
Select NodeName As Item, Count(*) As CountNot0
From SampleNormalised
Where NodeName <> 'UserId' AND NodeValue <> 0
Group By NodeName;
结果:
Item CountNot0
----- ---------
Item1 2
Item2 1
不确定这会对您有所帮助,但SQL中没有办法跳过结果集中的一列(User Id
)而不枚举除Monofuse提到的动态SQL之外的所有其他列