【发布时间】: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