1

我有一个带有内部连接的嵌套查询,它返回给定“软件”的多条记录,但我需要将结果压缩在一行中......(输出已附加)对于一个软件,您会看到多条带有字段的记录使用“已解决”和“未解决”,我需要将其压缩为一行,分别显示已解决-已解决-未解决...例如。但有时,同一列会有两个或多个“已解决”记录。我想创建一个新列,如 SPPA2 或 WCS2 等...如果发生这种情况,并将同一列中每条记录的日期组合为“已解决”或“未解决”我是新手,所以试图让我的头脑围绕逻辑。

SELECT * FROM
(SELECT act.Vendor  + ' ' + act.[Application Name] + ' ' + act.Version as "Software name"
                ,act.srmNumber as SRM#
                ,ssd.DateAssign

                ,IIF(ssd.DateResolv IS NOT NULL AND ssd.EntryText LIKE '%Step 1%' AND ssd.TargetUnitID = 48, 'Resolved', 'Not Resolved') as SPPA
                ,IIF(ssd.DateResolv IS NOT NULL AND ssd.EntryText LIKE '%Step 2%' AND ssd.TargetUnitID = 39, 'Resolved', 'Not Resolved') as WCS
                ,IIF(ssd.DateResolv IS NOT NULL AND ssd.EntryText LIKE '%Step 3%' AND ssd.TargetUnitID = 738, 'Resolved', 'Not Resolved') as SAM   
FROM [SAMI_Main].dbo.vw_SAM_Software_Deployment AS ssd INNER JOIN [SAMI_Main].dbo.ACT_Inventory AS act ON act.srmNumber = RIGHT(ssd.callID,7)) AS T1
WHERE t1.SPPA = 'Resolved' OR t1.WCS = 'Resolved' OR t1.SAM = 'Resolved'
;

在这里输出

4

2 回答 2

0

这是预期的输出吗?

|Software Name|SRM#|SPPA|WCS|SAM|

|SAP...|1456484|Resolved 2015-09-22|Not Resolved|Not Resolved|

|Dessci...|1514703|Resolved 2016-01-20|Not Resolved|Not Resolved|

|Adobe Air...|1525807|Resolved 2016-02-11|Not Resolved|Not Resolved|

如果是这样,此查询可能会起作用。我无权访问 SQL Server,所以我不确定语法:

SELECT DISTINCT software_name AS [Software Name],
SRM#,
IIF(SPPA = 'Resolved', 'Resolved' + ' ' + MAX(DateAssign OVER (PARTITION BY software_name, SPPA), 'Not Resolved') AS SPPA,
IIF(WCS = 'Resolved', 'Resolved' + ' ' + MAX(DateAssign OVER (PARTITION BY software_name, WCS), 'Not Resolved') AS WCS, 
IIF(SAM = 'Resolved', 'Resolved' + ' ' + MAX(DateAssign OVER (PARTITION BY software_name, SAM), 'Not Resolved') AS SAM
FROM
(SELECT act.Vendor  + ' ' + act.[Application Name] + ' ' + act.Version as software_name
,act.srmNumber as SRM#
,ssd.DateAssign
,IIF(ssd.DateResolv IS NOT NULL AND ssd.EntryText LIKE '%Step 1%' AND ssd.TargetUnitID = 48, 'Resolved', 'Not Resolved') as SPPA
,IIF(ssd.DateResolv IS NOT NULL AND ssd.EntryText LIKE '%Step 2%' AND ssd.TargetUnitID = 39, 'Resolved', 'Not Resolved') as WCS
,IIF(ssd.DateResolv IS NOT NULL AND ssd.EntryText LIKE '%Step 3%' AND ssd.TargetUnitID = 738, 'Resolved', 'Not Resolved') as SAM   
FROM [SAMI_Main].dbo.vw_SAM_Software_Deployment AS ssd 
INNER JOIN [SAMI_Main].dbo.ACT_Inventory AS act ON act.srmNumber =     RIGHT(ssd.callID,7)) AS T1
WHERE t1.SPPA = 'Resolved' OR t1.WCS = 'Resolved' OR t1.SAM = 'Resolved';

我在这里使用了 MAX 关键字作为分析函数。我之前写过关于 MAX 关键字的文章,但是是从 Oracle 的角度来看的。我知道它在 SQL Server 中的工作方式类似。

于 2016-04-26T19:51:01.197 回答
0

感谢您的回复,我使用 MAX() for SqlServ 清理了您的代码中的语法。它给出了附加的输出...在 此处输出

所以我只需要将记录压缩为一条记录,对于每个软件,每个软件都显示您提供的 MAX() 日期的每个 Resolved 列,如果每个列中都存在...所以在示例中,它将是“Adobe Air”作为一个记录,所有列“已解决”。其他 2 个软件是预期的。

SELECT DISTINCT software_name AS [Software Name],

SRM#, IIF(SPPA = 'Resolved', 'Resolved' + ' (' + MAX(DateAssign) OVER (PARTITION BY software_name, SPPA) + ')', 'Not Resolved') AS SPPA, IIF(WCS = 'Resolved ', 'Resolved' + ' (' + MAX(DateAssign) OVER (PARTITION BY software_name, WCS) + ')', 'Not Resolved') AS WCS, IIF(SAM = 'Resolved', 'Resolved' + ' (' + MAX(DateAssign) OVER (PARTITION BY software_name, SAM) + ')', 'Not Resolved') AS SAM FROM (SELECT act.Vendor + ' ' + act.[Application Name] + ' ' + act.Version as software_name ,act.srmNumber as SRM# ,ssd.DateAssign ,IIF(ssd.DateResolv IS NOT NULL AND ssd.EntryText LIKE '%Step 1%' AND ssd.TargetUnitID = 48, 'Resolved', 'Not Resolved') as SPPA , IIF(ssd.DateResolv 不为空且 ssd。EntryText LIKE '%Step 2%' AND ssd.TargetUnitID = 39, 'Resolved', 'Not Resolved') as WCS ,IIF(ssd.DateResolv IS NOT NULL AND ssd.EntryText LIKE '%Step 3%' AND ssd.TargetUnitID = 738,“已解决”,“未解决”)为 SAM
FROM [SAMI_Main].dbo.vw_SAM_Software_Deployment AS ssd INNER JOIN [SAMI_Main].dbo.ACT_Inventory AS act ON act.srmNumber = RIGHT(ssd.callID,7)) AS t1 WHERE t1.SPPA = 'Resolved' OR t1.WCS = 'Resolved' OR t1.SAM = 'Resolved' ORDER BY SRM# DESC;

于 2016-04-27T12:13:55.890 回答