sql >> Database teknologi >  >> RDS >> Sqlserver

Brug af pivottabel med kolonne- og rækketotaler i sql server 2008

Der kan være forskellige tilgange til dette. Du kan beregne alle totalerne efter pivoten, eller du kan få totalerne først og derefter pivotere alle resultaterne. Det er også muligt at have en slags mellemvej:få en slags totaler (f.eks. rækkevis), drej og få den anden slags, selvom det måske er at overdrive det.

Den første af de nævnte tilgange, at få alle totalerne efter pivoten, kunne gøres på en meget ligetil måde, og det eneste potentielt nye for dig i nedenstående implementering kan være GROUP BY ROLLUP() :

SELECT [ ] = ISNULL(environment_name, 'Total'), [Enviro] = SUM([Enviro]), [Requi] = SUM([Requi]), [Dev] = SUM([Dev]), [Tsc] = SUM([Tsc]), [TD] = SUM([TD]), [Unkn] = SUM([Unkn]), Total = SUM([Enviro] + [Requi] + [Dev] + [Tsc] + [TD] + [Unkn]) FROM ( SELECT environment_name, root_cause FROM test1 ) s PIVOT ( COUNT(root_cause) FOR root_cause IN ([Enviro], [Requi], [Dev], [Tsc], [TD], [Unkn]) ) p GROUP BY ROLLUP(environment_name) ;

Grundlæggende er GROUP BY ROLLUP() del producerer total rækken for dig. Grupperingen udføres først af environment_name , så tilføjes den samlede række.

For at gøre det modsatte, dvs. få totalerne før pivotering, kan du bruge GROUP BY CUBE() sådan her:

SELECT [ ] = environment_name, [Enviro] = ISNULL([Enviro], 0), [Requi] = ISNULL([Requi] , 0), [Dev] = ISNULL([Dev] , 0), [Tsc] = ISNULL([Tsc] , 0), [TD] = ISNULL([TD] , 0), [Unkn] = ISNULL([Unkn] , 0), Total = ISNULL(Total , 0) FROM ( SELECT environment_name = ISNULL(environment_name, 'Total'), root_cause = ISNULL(root_cause, 'Total'), cnt = COUNT(*) FROM test1 WHERE root_cause IS NOT NULL GROUP BY CUBE(environment_name, root_cause) ) s PIVOT ( SUM(cnt) FOR root_cause IN ([Enviro], [Requi], [Dev], [Tsc], [TD], [Unkn], Total) ) p ;

Begge metoder kan testes og spilles med på SQL Fiddle:

Bemærk. Jeg har udeladt unpivoting-trinnet i begge forslag, fordi unpivotering af en enkelt kolonne virkede klart overflødig. Hvis der er mere i det, bør det dog være nemt at justere en af ​​forespørgslerne.



  1. Parsing af data i tabeller

  2. Er det muligt at bruge en MySql brugerdefineret variabel i en .NET MySqlCommand?

  3. MySql:sæt en variabel med en liste

  4. Matchende nærmeste længde/breddegrad