2017-06-13 39 views
0

我有两个表如下的Sql得到数和总行数动态

NameId  Name 
11  Ancillary 
22  Reviews 
33  Audit 
44  Logging 

id  NameId CountyId 
51  11  1 
52  11  1 
53  11  2 
54  22  2 
55  22  3 
56  33  3 
57  33  3 

结果应该是关联到下面一个县名的总数。如果Nameid超过4个名称,Nameid可以是动态的,查询应该能够自动显示计数而不需要硬编码行名称。还要计算最后每行的总数。

CountyId AncillaryCount ReviewsCount AuditCount LoggingCount Total 
1   2    0    0    0    2 
2   1    1    0    0    2 
3   0    1    2    0    3 
+3

搜索 '动态SQL支点',应该有一堆的结果。如果它实际上不需要是动态的(例如,您只有4个不同的实际需要计数),则可以执行常规透视(或案例聚合)。 – ZLK

+0

[T-SQL动态数据透视表]的可能重复(https://stackoverflow.com/questions/12210692/t-sql-dynamic-pivot) – iamdave

回答

1
IF OBJECT_ID('Tempdb..#Temp') IS NOT NULL 
Drop table #Temp 

DECLARE @TabA Table (NameId INT,Name Varchar(100)) 
INSERT INTO @TabA 
SELECT 11,'Ancillary' Union all 
SELECT 22,'Reviews' Union all 
SELECT 33,'Audit'  Union all 
SELECT 44,'Logging' 

DECLARE @TabB Table (id INT, NameId INT,CountyId INT) 
INSERT INTO @TabB 
SELECT 51,11,1 UNION ALL 
SELECT 52,11,1 UNION ALL 
SELECT 53,11,2 UNION ALL 
SELECT 54,22,2 UNION ALL 
SELECT 55,22,3 UNION ALL 
SELECT 56,33,3 UNION ALL 
SELECT 57,33,3 UNION ALL 
SELECT 57,44,3 

SELECT B.CountyId, 
A.Name, 
COUNT(A.Name) Over(Partition by B.CountyId,A.Name Order by B.CountyId) AS CountName 
INTO #Temp from @TabA A 
LEFT join @TabB B 
On b.NameId=a.NameId 


DECLARE @Coulmn nvarchar(max), 
     @Coulmn2 nvarchar(max), 
     @SumCoulmn nvarchar(max), 
     @Sql nvarchar(max) 

SELECT @Coulmn=STUFF((SELECT DISTINCT ', '+ '['+ Name +']' From #Temp 
FOR XML PATH ('')),1,1,'') 

SELECT @SumCoulmn=STUFF((SELECT DISTINCT ', '+ + Name +'Count' From #Temp 
FOR XML PATH ('')),1,1,'') 
SET @SumCoulmn= '('+REPLACE(@SumCoulmn,',',' + ')+')' 

SELECT @Coulmn2=STUFF((SELECT DISTINCT ', '+ 'ISNULL(' + Name + ',''0'')' +' AS ['+Name +'Count]' From #Temp 
FOR XML PATH ('')),1,1,'') 

SET @Sql='SELECT *,'[email protected]+ ' AS Total From 
      ( 
      SELECT CountyId,'[email protected]+ ' From 
      (
      SELECT * From #Temp 
      )As Src 
      PIVOT 
      (
      MAX(CountName) FOR Name IN ('+ @Coulmn +') 
      )Pvt 
      )Dt 
      ' 
Print @Sql 
Exec(@Sql) 
+0

仅有代码的答案不是一个好答案。解释这是什么以及为什么它包含OP的问题。它对OP没有帮助,对其他可能有类似问题的人没有用。 SO是一个问答网站,而不是论坛。您正在使用第二快的方法汇总名称。然后你正在创建一个PIVOT状态表。临时表有什么用?这不是PIVOT的工作吗? –

+0

@PanagiotisKanavos作为一名开发人员,在我看来,我写的代码,如果你认为你可以给予更好的答案,你可以给,但不要批评别人 – 2017-06-13 08:35:33

+0

请检查SO旅游和指导方针,特别是[如何写一个好东西答案](https://stackoverflow.com/help/how-to-answer)。仅有代码的答案被视为低质量并自动标记以供审查。这[已广泛讨论](https://meta.stackoverflow.com/questions/290231/is-it-wrong-to-ask-for-an-explanation-of-how-why-the-code-works-在代码只-ANS)。 –