sql - 如何在 SQL Server 中跨多列选择所有非数字值?

标签 sql sql-server unpivot

我有一张表价格

ID Price_1 Price_2 Price_3

P1 10      11      12
P2 13      14      15
P3 aa      16      bb
P4 19      cc      20

从上面可以看出,Price_1Price_2Price_3 列中的某些值可能不是数字。

我想要的是首先找到所有那些非数字值然后给出一个总结(连接所有非数字值和一个id的列)

所以对于上面的例子,我想要的是

ID   Bad_Columns      Bad_Values
P3   Price_1,Price_3  aa,bb
P4   Price_2          cc

我应该如何写这个查询?

最佳答案

你可以这样做:

WITH CTE AS
(   SELECT  ID, Value, ColumnName
    FROM    Prices
            UNPIVOT
            (   Value
                FOR ColumnName IN ([Price_1], [Price_2], [Price_3])
            ) upvt
    WHERE   ISNUMERIC(Value) = 0
)
SELECT  ID,
        BadColumns = STUFF((SELECT  ', ' + ColumnName 
                            FROM    CTE
                            WHERE   CTE.ID = t.ID
                            FOR XML PATH(''), TYPE
                        ).value('.', 'NVARCHAR(MAX)'), 1, 2, ''),
        BadValues = STUFF(( SELECT  ', ' + Value 
                            FROM    CTE
                            WHERE   CTE.ID = t.ID
                            FOR XML PATH(''), TYPE
                        ).value('.', 'NVARCHAR(MAX)'), 1, 2, '')
FROM    (SELECT DISTINCT ID FROM CTE) t

第一部分 UNPIVOT 您的查询以将列作为行获取,然后第二部分将“坏”行连接成一列。

Example on SQL Fiddle

关于sql - 如何在 SQL Server 中跨多列选择所有非数字值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15205420/

相关文章:

sql - VIEW中的ORDER BY返回不同的结果SQL

sql-server - 如何将 SQL Server 存储过程的输出存储在 .txt 文件中

sql - 连接如何影响使用的索引?

sql - 查找 SQL 中多列中出现次数最多的情况

sql-server - 旋转两列并保持其他列不变

mysql - MySQL 中的反透视表

sql - Red-Gate SQL 源代码控制 (SSC) 中的链接表 - 性能噩梦?

asp.net - 在SAAS架构中,如何处理 Multi-Tenancy 的数据库模式和MVC用户登录

mysql - 如何添加表中同一列的两种值