Как получить '0' в count (), используя сводную в SQL Server - PullRequest
1 голос
/ 09 июля 2019

Я делаю SELECT для моей таблицы с оператором PIVOT.Когда он подсчитывает поле MARCA_INCUMP в столбцах [0] и [1] через несколько лет, у него нет записей, и мне нужно, чтобы оно показывало ноль (0).В другой год, когда у него есть записи, он показывает без проблем.

SELECT FECHA_SOLICITUD, GRUPO AS GRUPO, [0], [1], 
    ([0]+[1]) AS TOTAL, ([1]*1.0) / ([0]+[1]) AS PD_REAL
FROM (SELECT MARCA_INCUMP, GRUPO, FECHA_SOLICITUD FROM MyTable) AS SourceTable 
PIVOT (
 COUNT(MARCA_INCUMP)
 FOR MARCA_INCUMP IN ([0], [1]) 
) AS PivotTable 
GROUP BY fecha_solicitud, GRUPO, [0], [1]
ORDER BY FECHA_SOLICITUD, GRUPO ASC;

Мне нужно это

DATE  GRUPO [0] [1] TOTAL           PD
201411  1   0   0   0   0.000000000000
201411  2   30  3   33  0.090909090909
201411  3   89  2   91  0.021978021978
201411  4   82  7   89  0.078651685393
201411  5   185 20  205 0.097560975609
201411  6   129 21  150 0.140000000000
201411  7   70  14  84  0.166666666666
201411  8   40  12  52  0.230769230769
201411  9   38  31  69  0.449275362318
201411  10  10  19  29  0.655172413793

, и у меня есть это

DATE  GRUPO [0] [1] TOTAL           PD
201412  2   37  1   38  0.026315789473
201412  3   83  5   88  0.056818181818
201412  4   78  9   87  0.103448275862
201412  5   207 24  231 0.103896103896
201412  6   117 19  136 0.139705882352
201412  7   75  17  92  0.184782608695
201412  8   30  11  41  0.268292682926
201412  9   35  33  68  0.485294117647
201412  10  8   34  42  0.809523809523

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Полагаю, проблема в том, что COUNT буквально считает все.Из документов :

COUNT (*) возвращает количество элементов в группе.Это включает в себя значения NULL и дубликаты.

Итак, нам нужно считать только значения, которые 0 и 1 и PIVOT.

Попробуйте выполнить следующее:

SELECT FECHA_SOLICITUD
      ,GRUPO AS GRUPO
      ,[0]
      ,[1]
      ,([0]+[1]) AS TOTAL, ([1]*1.0) / ([0]+[1]) AS PD_REAL
FROM
(
    SELECT GRUPO
          ,FECHA_SOLICITUD 
          ,SUM(IIF(MARCA_INCUMP = 0, 1, 0)) AS [0]
          ,SUM(IIF(MARCA_INCUMP = 1, 1, 0)) AS [1]
    FROM MyTable
    GROUP BY GRUPO
            ,FECHA_SOLICITUD 
) DS
GROUP BY fecha_solicitud, GRUPO, [0], [1]
ORDER BY FECHA_SOLICITUD, GRUPO ASC;
0 голосов
/ 09 июля 2019

Вы должны сделать LEFT JOIN между запросом, который возвращает все возможные периоды (или группы), и вашим существующим запросом.Если возможными периодами являются только номера месяцев, вы можете указать их в предложении VALUES.Если возможные группы находятся в другой таблице, просто используйте эту таблицу.

...