查询以计算每列的类似值

Rey*_*yaz 3 sql sql-server sql-server-2012

请帮助您获取下表的查询

????????????????
? A  B   C   D ?
????????????????
? N  E   1  -5 ?
? N  N   4  -3 ?
? N  -4  6   E ?
? 3  E   E  -8 ?
? 1  N   N   N ?
????????????????
Run Code Online (Sandbox Code Playgroud)

我需要输出如下

???????????????????????????????????
?    N    E     NegativeValues    ?
???????????????????????????????????
? A  3    0     0                 ?
? B  2    2     1                 ?
? C  1    1     0                 ?
? D  1    1     3                 ?
???????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

我需要得到N和E的计数以及所有列的负值.请帮忙.提前致谢

更新 此处N为NULL,E以字符串"-1E + 70"开头

Gid*_*dil 7

尝试取消旋转,然后有条件地计算行数.
像这样的东西:

SELECT ABC, 
       Sum(CASE 
             WHEN VALS = 'n' THEN 1 
             ELSE 0 
           END) n, 
       Sum(CASE 
             WHEN VALS = 'e' THEN 1 
             ELSE 0 
           END) E, 
       Sum(CASE 
             WHEN LEFT(VALS, 1) = '-' THEN 1 
             ELSE 0 
           END) NegativeValues 
FROM   TABLE1 
       UNPIVOT (VALS 
               FOR ABC IN ([A], 
                           [B], 
                           [C], 
                           [D]))t 
GROUP  BY ABC 
Run Code Online (Sandbox Code Playgroud)

看看SQL Fiddle上的一个工作示例.
祝好运!


考虑到'n'值实际上是NULL并且UNPIVOT函数丢弃NULL值并且'e'值实际上是'-1e',这里是查询的更新版本:

SELECT ABC, 
       Sum(CASE 
             WHEN VALS = 'NULL' THEN 1 
             ELSE 0 
           END) n, 
       Sum(CASE 
             WHEN VALS = '-1e' THEN 1 
             ELSE 0 
           END) E, 
       Sum(CASE 
             WHEN LEFT(VALS, 1) = '-' 
                  AND Charindex('e', VALS) = 0 THEN 1 
             ELSE 0 
           END) NegativeValues 
FROM   (SELECT Isnull(A, 'NULL')A, 
               Isnull(B, 'NULL')B, 
               Isnull(C, 'NULL')C, 
               Isnull(D, 'NULL')D 
        FROM   TABLE1)T 
       UNPIVOT (VALS 
               FOR ABC IN ([A], 
                           [B], 
                           [C], 
                           [D]))t 
GROUP  BY ABC 
Run Code Online (Sandbox Code Playgroud)

这里是SQL Fiddle的更新链接.


编辑 使用新信息-1e实际上是科学数字,并且所有字段都是浮点类型,这是我更新的解决方案(希望最终):

SELECT ABC, 
       Sum(CASE 
             WHEN VALS = 'NULL' THEN 1 
             ELSE 0 
           END) n, 
       Sum(CASE 
             WHEN VALS LIKE '-1e+070%' THEN 1 
             ELSE 0 
           END) E, 
       Sum(CASE 
             WHEN LEFT(VALS, 1) = '-' 
                  AND Charindex('e', VALS) = 0 THEN 1 
             ELSE 0 
           END) NegativeValues 
FROM   (SELECT Isnull(Cast(A AS VARCHAR(10)), 'NULL')A, 
               Isnull(Cast(B AS VARCHAR(10)), 'NULL')B, 
               Isnull(Cast(C AS VARCHAR(10)), 'NULL')C, 
               Isnull(Cast(D AS VARCHAR(10)), 'NULL')D 
        FROM   TABLE1)T 
       UNPIVOT (VALS 
               FOR ABC IN ([A], 
                           [B], 
                           [C], 
                           [D]))t 
GROUP  BY ABC 
Run Code Online (Sandbox Code Playgroud)

当然是SQL Fiddle的新链接.