Подсчет значений в двух таблицах при объединении четырех - PullRequest
0 голосов
/ 01 марта 2019

У меня проблема с MS SQL, которую я не могу решить самостоятельно.Ниже приведены таблицы.

AREAS
----------------
RA_NAME varchar
RA_DESC varchar

AD_Results
-------------------
AssetName varchar
Parent_Counter varchar (the RA Name is somewhere within that field)

tblAssets
-----------
AssetID int

tblADComputers
----------------
AssetID int
OU varchar (the RA Name is somewhere within that field)

Я хотел прочитать таблицу AREAS с именем RA и описанием и подсчитать количество AssetNames в AD_Results на основе их RA, а затем посчитать также AssetID в tblAssets, также основанныхдля имени RA.

Общим "ключом" является Имя RA, но оно не является ключевым полем в этих таблицах;на самом деле это подстрока обычного поля.

Два отдельных запроса работают нормально, объединение их в один дает безумно высокие значения в RA_AD_Objects.

Я пытался получить такой список

RA_NAME RA_DESC RA_AD_Objects   RA_LS_Push
RA001   X01-01  549909          279
RA002   X02-02  635             0
RA004   X03-04  259306          409

Мой запрос выглядит так:

 CREATE View AD_LS_CNT AS
 SELECT
        AREAS.RA_NAME
    ,   AREAS.RA_DESC
    ,   COUNT(CASE
                WHEN CharIndex('/RA', AD_Results.[Parent Container]) > 1
                THEN
                SubString(AD_Results.[Parent Container], CharIndex('/RA', AD_Results.[Parent Container]) + 1, 5)
                When CharIndex('/SH', AD_Results.[Parent Container]) > 1
                THEN
                SubString(AD_Results.[Parent Container], CharIndex('/SH', AD_Results.[Parent Container]) + 1, 5)
                ELSE
                'N.A.'
              End) AS RA_AD_Objects
    ,   COUNT( DISTINCT tblAssets.AssetID) AS RA_LS_Push
FROM AREAS
JOIN AD_Results ON CHARINDEX(AREAS.RA_NAME, AD_Results.[Parent Container]) > 0
LEFT JOIN tblADComputers ON CHARINDEX(AREAS.RA_NAME, tblADComputers.OU) > 0
LEFT JOIN tblAssets ON tblAssets.AssetID = tblADComputers.AssetID
GROUP BY AREAS.RA_NAME, AREAS.RA_DESC
ORDER BY AREAS.RA_NAME
GO

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

После уик-энда анализа я получил ответ:

SELECT
        AREAS.RA_NAME
    ,   AREAS.RA_DESC
    ,   COUNT( DISTINCT AD_Results.Name) AS RA_AD_Objects
    ,   COUNT( DISTINCT tblAssets.AssetID) AS RA_LS_Objects
FROM AREAS
JOIN AD_Results ON CHARINDEX(AREAS.RA_NAME, AD_Results.[Parent Container]) > 0
LEFT JOIN tblADComputers ON CHARINDEX(AREAS.RA_NAME, tblADComputers.OU) > 0
LEFT JOIN tblAssets ON tblAssets.AssetID = tblADComputers.AssetID
GROUP BY AREAS.RA_NAME, AREAS.RA_DESC
ORDER BY AREAS.RA_NAME
GO

Весь СЧЕТ (СЛУЧАЙ ... перепутал его, и он действительно не был нужен.

0 голосов
/ 01 марта 2019

Вы можете попробовать это

SUM(CASE WHEN CHARINDEX(AREAS.RA_NAME, AD_Results.[Parent Container]) > 0 THEN 1 ELSE 0 END) AS  RA_AD_Objects
...