2016-12-15 187 views
1

已询问此问题的多种风格,但我无法找到我想要做的转换。这是我原来的表(SQLSERVER):计算SQL中多列中不同组合的不同组合的数量

State City   Job 
CA  LOS ANGELES DEVELOPER 
CA  SAN FRANCISCO DESIGNER 
CA  LOS ANGELES DESIGNER 
NY  NEW YORK  DEVELOPER 

我想计数状态和城市的不同组合,并返回其作为表中的新列。因此,最终产品的样子:

State City   Job   # of Unique 
CA  LOS ANGELES DEVELOPER 3 
CA  SAN FRANCISCO DESIGNER 3 
CA  LOS ANGELES DESIGNER 3 
NY  NEW YORK  DEVELOPER 3 

我想这样做有相同的表,并使用计数的内部连接,但没有返回正确的结果。任何帮助将不胜感激。

+0

你的输出不会输入相匹配。你在期待2加州 - 洛杉矶和1其他两行在这里? –

回答

3

试试此查询;

测试数据

CREATE TABLE #TestData (State nvarchar(2), City nvarchar(20), Job nvarchar(20)) 
INSERT INTO #TestData 
VALUES 
('CA','LOS ANGELES','DEVELOPER') 
,('CA','SAN FRANCISCO','DESIGNER') 
,('CA','LOS ANGELES','DESIGNER') 
,('NY','NEW YORK','DEVELOPER') 

查询

SELECT 
    a.State 
    ,a.City 
    ,a.Job 
    ,b.CountField 
FROM #TestData a 
CROSS JOIN (SELECT 
      COUNT(DISTINCT State + City) CountField 
      FROM #TestData 
      ) b 

输出(无序因为声明没有顺序)

State City   Job   CountField 
CA  LOS ANGELES  DEVELOPER 3 
CA  LOS ANGELES  DESIGNER 3 
CA  SAN FRANCISCO DESIGNER 3 
NY  NEW YORK  DEVELOPER 3 

按在评论你的问题,你可以做到这一点,以在计数中仅筛选CA;

SELECT 
    a.State 
    ,a.City 
    ,a.Job 
    ,b.CountField 
FROM #TestData a 
CROSS JOIN (SELECT 
      COUNT(DISTINCT State + City) CountField 
      FROM #TestData 
      WHERE State = 'CA' 
      ) b 

哪些应该输出

State City   Job   CountField 
CA  LOS ANGELES  DEVELOPER 2 
CA  LOS ANGELES  DESIGNER 2 
CA  SAN FRANCISCO DESIGNER 2 
NY  NEW YORK  DEVELOPER 2 
+0

感谢Rich,但在CountField下,我希望能够显示每行重复的状态和城市的独特组合总数。所以我的例子,唯一的组合是CA - LA/CA - SANFRAN/NY - NY,所以count列在每一行都会返回3。那有意义吗? – rafacardosoc

+0

@rafacardosoc啊,gotcha。尝试一个 –

+0

谢谢里奇,我标记你的回答是正确的,但有最后一个caviat问。这个查询是否允许我过滤一个州或城市,并且计数会更新?举例来说,如果我做一个where state = CA,而不是每行输出3的表,它会显示2,因为它排除了NY。 – rafacardosoc