2013-08-02 3 views
3

Пожалуйста, не могли бы вы помочь получить запрос на таблицу нижезапроса для подсчета аналогичных значений для каждого столбца

╔══════════════╗ 
║ A B C D ║ 
╠══════════════╣ 
║ N E 1 -5 ║ 
║ N N 4 -3 ║ 
║ N -4 6 E ║ 
║ 3 E E -8 ║ 
║ 1 N N N ║ 
╚══════════════╝ 

Мне нужна выход, как показано ниже

╔═════════════════════════════════╗ 
║ N E  NegativeValues ║ 
╠═════════════════════════════════╣ 
║ A 3 0  0     ║ 
║ B 2 2  1     ║ 
║ C 1 1  0     ║ 
║ D 1 1  3     ║ 
╚═════════════════════════════════╝ 

мне нужно получить количество для N и E и отрицательных значений для всех столбцов. Пожалуйста помоги. Заранее спасибо

Update Здесь N является NULL, и Е начинается со строки «-1e + 70»

+1

Какой сервер вы используете MS SQL-Server или Oracle? –

+0

Привет, Игорь, я использую SQL Server 2012 – Reyaz

+1

@Reyaz: Что вы пробовали? –

ответ

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 

Посмотрите на рабочий пример на SQL Fiddle.
Удачи!


Принимая во внимание, что «п» значение фактически NULL и функция UNPIVOT падает NULL значения, и что «е» значение на самом деле «-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 

А вот обновленная ссылка на 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 

И курс новой ссылки на SQL Fiddle.

+1

+1 - за хороший и быстрый ответ :) – Devart

+1

@Devart: То же самое для вас! :) – Gidil

+0

@Gidil: Спасибо за запрос, на самом деле N является NULL, а E - некоторой строкой в ​​моем случае. Я попытался заменить, но я не получаю количество нулей для столбца. пожалуйста, не могли бы вы помочь? – Reyaz

2

Попробуйте один -

DECLARE @temp TABLE (A CHAR(2), B CHAR(2), C CHAR(2), D CHAR(2)) 

INSERT INTO @temp (A, B, C, D) 
VALUES 
    (NULL, 'E' , '1', '-5'), 
    (NULL, NULL , '4', '-3'), 
    (NULL, '-4' , '6', 'E'), 
    ('3', 'E' , 'E', '-8'), 
    ('1', NULL , NULL, NULL) 

SELECT 
     Code 
    , N = COUNT(CASE WHEN Value = '' THEN 1 END) 
    , E = COUNT(CASE WHEN Value LIKE '%[A-Z]%' THEN 1 END) 
    , NegativeValues = COUNT(CASE WHEN LEFT(Value, 1) = '-' THEN 1 END) 
FROM (
    SELECT 
      A = ISNULL(A, '') 
     , B = ISNULL(B, '') 
     , C = ISNULL(C, '') 
     , D = ISNULL(D, '') 
    FROM @temp 
) t 
UNPIVOT 
(
    Value FOR Code IN (A, B, C, D) 
) unpvt 
GROUP BY Code 
+0

Спасибо за запрос, но здесь N NULL и E - строка. не могли бы вы переписать запрос сейчас. спасибо – Reyaz

+0

@Reyaz, пожалуйста, просмотрите обновленный ответ. – Devart

+0

Спасибо за запрос, но если я его выполню, я получаю неправильный вывод для отрицательных значений (теперь результат выглядит следующим образом: для отрицательных значений = значения ошибок, которые начинаются с «-1E + 30» + фактических отрицательных значений). Помогите – Reyaz

1

Для более общего решения можно сослаться на следующий запрос:

SELECT "A", 
     Sum(N) N, 
     Sum(E) E, 
     Sum(M) "Negative" 
FROM (SELECT CASE 
       WHEN A = "N" THEN Count(A) 
       ELSE 0 
       END N, 
       CASE 
       WHEN A = "E" THEN Count(A) 
       ELSE 0 
       END E, 
       CASE 
       WHEN A LIKE "%-%" THEN Count(A) 
       ELSE 0 
       END "M" 
     FROM #TAB2 
     GROUP BY A) aa 
UNION 
SELECT "B", 
     Sum(N) N, 
     Sum(E) E, 
     Sum(M) "Negative" 
FROM (SELECT CASE 
       WHEN B = "N" THEN Count(B) 
       ELSE 0 
       END N, 
       CASE 
       WHEN B = "E" THEN Count(B) 
       ELSE 0 
       END E, 
       CASE 
       WHEN B LIKE "%-%" THEN Count(B) 
       ELSE 0 
       END "M" 
     FROM #TAB2 
     GROUP BY B) bb 
UNION 
SELECT "C", 
     Sum(N) N, 
     Sum(E) E, 
     Sum(M) "Negative" 
FROM (SELECT CASE 
       WHEN C = "N" THEN Count(A) 
       ELSE 0 
       END N, 
       CASE 
       WHEN C = "E" THEN Count(A) 
       ELSE 0 
       END E, 
       CASE 
       WHEN C LIKE "%-%" THEN Count(C) 
       ELSE 0 
       END "M" 
     FROM #TAB2 
     GROUP BY C) cc 
UNION 
SELECT "D", 
     Sum(N) N, 
     Sum(E) E, 
     Sum(M) "Negative" 
FROM (SELECT CASE 
       WHEN D = "N" THEN Count(D) 
       ELSE 0 
       END N, 
       CASE 
       WHEN D = "E" THEN Count(D) 
       ELSE 0 
       END E, 
       CASE 
       WHEN D LIKE "%-%" THEN Count(D) 
       ELSE 0 
       END "M" 
     FROM #TAB2 
     GROUP BY D) dd 
+1

благодарить @Gidil за форматирование запроса. привет! –

+0

Мое удовольствие :-) – Gidil

Смежные вопросы