Tsql 与T-SQL中的聚合混淆

Tsql 与T-SQL中的聚合混淆,tsql,Tsql,好的:这是我的一些表格结构,在这里很重要 CaseStudyID int Title nvarchar(50) OverrideTitle nvarchar(50) 我程序的一部分 Declare @Temp table(CaseStudyID int, Title nvarchar(50)) Insert Into @Temp SELECT CaseStudyID,Title FROM CaseStudy WHERE Visible = 1 AND Displ

好的:这是我的一些表格结构,在这里很重要

CaseStudyID int
Title nvarchar(50)
OverrideTitle nvarchar(50)
我程序的一部分

Declare @Temp table(CaseStudyID int,
            Title nvarchar(50))

Insert Into @Temp 
SELECT CaseStudyID,Title 
FROM CaseStudy 
WHERE Visible = 1 AND DisplayOnHomePage = 1 
ORDER BY Title

Update @Temp Set Title = TitleOverride 
--Here is where im lost if the title occurs more than once
--I need to replace it with the override
--Schoolboy error or leaking brain I cant get it going


Select * From @Temp

有人能帮忙吗?

不使用临时表,您可以通过以下方式实现:

SELECT 
    MIN(CaseStudyID) AS CaseStudyID, 
    CASE WHEN count(*) = 1 THEN 
       MIN(Title) 
    ELSE
       MIN(OverrideTitle) 
    END AS Title
FROM CaseStudy
GROUP BY Title
ORDER BY Title

您可以通过以下方式实现此目的,而无需使用临时表:

SELECT 
    MIN(CaseStudyID) AS CaseStudyID, 
    CASE WHEN count(*) = 1 THEN 
       MIN(Title) 
    ELSE
       MIN(OverrideTitle) 
    END AS Title
FROM CaseStudy
GROUP BY Title
ORDER BY Title

我不确定你是否需要原始表格的每一行。下面是我的备选解决方案,它为您提供了每一行:

SELECT CaseStudyID, Title 
FROM CaseStudy c1
WHERE NOT EXISTS (
   SELECT * FROM CaseStudy c2 
   WHERE c2.CaseStudyID <> c1.CaseStudyID and c2.Title = c1.Title
)

UNION ALL

SELECT CaseStudyID, OverrideTitle
FROM CaseStudy c1
WHERE exists (
   SELECT * FROM CaseStudy c2
   WHERE c2.CaseStudyID <> c1.CaseStudyID and c2.Title = c1.Title
)

ORDER BY Title

我不确定你是否需要原始表格的每一行。下面是我的备选解决方案,它为您提供了每一行:

SELECT CaseStudyID, Title 
FROM CaseStudy c1
WHERE NOT EXISTS (
   SELECT * FROM CaseStudy c2 
   WHERE c2.CaseStudyID <> c1.CaseStudyID and c2.Title = c1.Title
)

UNION ALL

SELECT CaseStudyID, OverrideTitle
FROM CaseStudy c1
WHERE exists (
   SELECT * FROM CaseStudy c2
   WHERE c2.CaseStudyID <> c1.CaseStudyID and c2.Title = c1.Title
)

ORDER BY Title

这将用相应的OverrideTile值替换多次出现的每个标题

它将保留第一个出现的标题,例如,如果您有3个标题,如a、a、a,则只替换第二个和第三个标题

select distinct
    cs1.CaseStudyID,
    case when cs2.CaseStudyID is null then cs1.Title else cs1.overrideTitle end as title
from  
    CaseStudy cs1
    left join CaseStudy cs2 
        on cs1.title = cs2.title
        and cs1.CaseStudyID > cs2.CaseStudyID
如果您想替换所有这些,只需将>更改为如下所示


这将用相应的OverrideTile值替换多次出现的每个标题

它将保留第一个出现的标题,例如,如果您有3个标题,如a、a、a,则只替换第二个和第三个标题

select distinct
    cs1.CaseStudyID,
    case when cs2.CaseStudyID is null then cs1.Title else cs1.overrideTitle end as title
from  
    CaseStudy cs1
    left join CaseStudy cs2 
        on cs1.title = cs2.title
        and cs1.CaseStudyID > cs2.CaseStudyID
如果您想替换所有这些,只需将>更改为如下所示


如果没有重复,他希望输出标题。如果表中有重复的标题,他想显示我猜的覆盖标题。如果没有重复的标题,他想输出标题。如果表中有一个重复的标题,他想显示我猜的覆盖标题。