您可以在所有列中使用SELECT *并设置条件

时间:2016-06-03 14:48:31

标签: sql

我有一个包含大约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的记录总数?

2 个答案:

答案 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之外的所有其他列