2011-05-09 83 views
1

我坚持建立一个复杂的查询,并希望有人可以帮助我,如果它甚至可能。我有一个表“竞争者”,这里是它的一些列:帮助与SQL查询

Type | Brand | Model | Date | Resolution | etc. 

该表将有重复Model项(有明显的相同Brand为好,但可能是不同Type(两种可能的类型:“专业视听”和'Disti'))。我需要建立一个查询,将输出像这样的表:

Top (ProAV) | Top (Disti) | Last Occurrence | Brand | Model | Resolution | etc. 

基本上,我需要一个查询,将得到不同类型,品牌和型号,但得到多少重复的次数被发现并将该数字放在Top(ProAV)或Top(Disti)中,无论它是哪个Type。我需要将最近的(给定日期)从副本中取出,以便我可以将其日期作为Last Occurrence字段。我希望这是有道理的,让我知道如果没有。非常感谢!

回答

2
SELECT SUM(CASE WHEN Type = 'ProAV' THEN 1 ELSE 0 END) AS TopProAV, 
     SUM(CASE WHEN Type = 'Disti' THEN 1 ELSE 0 END) AS TopDisti, 
     MAX(Date) AS LastOccurence, 
     Brand, Model, Resolution 
    FROM Competitor 
    GROUP BY Brand, Model, Resolution 

编辑 :根据评论,您可以使用子查询或CTE来完成你想要的。像这样:

WITH cteMaxDate AS (
    SELECT SUM(CASE WHEN Type = 'ProAV' THEN 1 ELSE 0 END) AS TopProAV, 
      SUM(CASE WHEN Type = 'Disti' THEN 1 ELSE 0 END) AS TopDisti, 
      MAX(Date) AS LastOccurence, 
      Brand, Model, Resolution 
     FROM Competitor 
     GROUP BY Brand, Model, Resolution 
) 
SELECT md.TopProAV, md.TopDisti, 
     md.LastOccurentce, 
     md.Brand, md.Model, md.Resolution, 
     c.AdditionalColumn1, c.AdditionalColumn2 
    FROM cteMaxDate md 
     INNER JOIN Competitor c 
      ON md.Brand = c.Brand 
       AND md.Model = c.Model 
       AND md.Resolution = c.Resolution 
       AND md.LastOccurence = c.Date 
+0

嗨乔,thx的答复。一个问题,我想要显示的任何额外的列我将不得不放在一个聚合函数或附加在GROUP BY子句,对吧?如果我将这些额外的列放在GROUP BY子句中并且数据不一致,我将获得多组数据,这不是我想要的。有没有办法显示与“LastOccurrence”字段相同的记录中的数据?或者我将不得不使用一些随机的聚合函数并且存在incosistent数据? – 2011-05-09 21:12:36

+0

@Nicklamort:查看我编辑的答案,了解您要求的示例。 – 2011-05-09 21:26:48

+0

你曾经向我致敬,非常感谢! – 2011-05-09 21:35:40

1

您有限制Type s吗?在这种情况下,你可以使用数据透视 更具体地说,

Type Model 
---- ----- 
A  X 
B  X 
C  Y 
A  Z 
NULL NULL 

您运行此查询表解决您的问题

Select Model, [A], [B], [C] 
From 
(select Model, Type 
from dbo.Competitor) as SourceTable 
PIVOT 
(Count([Type]) for [Type] in ([A], [B], [C])) as PivotTable 

得到

Model A B C 
------ - - - 
X  1 1 0 
Y  0 0 1 
Z  1 0 0