【问题标题】:Count values in two tables when joining four连接四个时计算两个表中的值
【发布时间】:2019-03-01 08:36:07
【问题描述】:

我有一个无法自行解决的 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)

我想阅读带有 RA 名称和描述的表 AREAS,并根据它们的 RA 计算 AD_Results 中 AssetNames 的数量,然后还根据 RA 名称计算 tblAssets 中的 AssetID。

常见的“关键”是 RA 名称,但它不是这些表中的关键字段;其实is是一个普通字段的子串。

两个单独的查询可以正常工作,将它们组合为一个会在 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

【问题讨论】:

  • 我编辑了最后不相关的部分,不需要关于视图的部分,因为它可以在问题中看到,你得到的任何答案都可以变成视图
  • 为了计算行数,为什么需要使用 substring 函数提取字符串。您只需要检查目标字段中是否存在字符串。
  • 也许你可以试试这个 SUM(CASE WHEN MATCHED THEN 1 ELSE 0 END)

标签: sql-server join count substring


【解决方案1】:

你可以试试这个

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

【讨论】:

  • 不幸的是,这次尝试在计数/求和中显示了完全错误的数字。
  • 能否分享一些测试数据。如果它在 excel 文件中会有所帮助。
【解决方案2】:

经过一个周末的分析,我得到了答案:

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

整个 COUNT(CASE ... 把它弄混了,它并不是真正需要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多