SQL Server La meilleure façon de créer une vue sommaire de plusieurs vues
-
21-09-2019 - |
Question
Étant donné que j'ai la vue suivante où N = 1..100
detail_view_N
Pant Quantity Fieldx ...
A 20
A 13
B 4
Nous avons actuellement des vues sommaires qui insèrent à une table comme
summary_view_N
Report_Name Plant Count
summary_view_1 A 2
summary_view_1 B 1
Le tableau est ensuite utilisé pour créer un résumé global comme
summary_view_all_plants
Report_Name Plant Count
summary_view_1 A 2
summary_view_1 B 1
...
summary_view_N X Y
Est-il possible de créer summary_view_all_plants sans avoir à créer chaque individu summary_view_N ? Je voudrais pouvoir itterate si une liste des rapports et générer dynamiquement les vues d'insertion.
La solution 3
une bonne solution trouvé à ce sujet. J'ai une table qui contient les noms des points de vue que je veux résumer (detail_view_Names). Je vais pensé chaque nom de rapport et construire une requête qui effectue le résumé de chaque rapport.
DECLARE @REPORT_ID nvarchar(50),
@sqlCommand varchar(1000)
DECLARE REPORT_cursor CURSOR
FOR SELECT Report_Name
FROM detail_view_Names
OPEN REPORT_cursor
FETCH NEXT FROM REPORT_cursor INTO @REPORT_ID
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sqlCommand = 'SELECT ''' + @Report_ID + ''' AS ReportName, Plant, COUNT(*) AS [Count] FROM dbo.' + @Report_ID + ' GROUP BY Plant'
EXEC (@sqlCommand)
FETCH NEXT FROM REPORT_cursor INTO @REPORT_ID
END
CLOSE REPORT_cursor
DEALLOCATE REPORT_cursor
Pour ajouter un nouveau rapport au résumé, il suffit d'ajouter un nouveau rapport à la detail_view_Names
Autres conseils
Y at-il un moyen de créer summary_view_all_plants sans avoir à créer chaque individu summary_view_N?
Non - vous devez définir toutes les tables et / ou des vues utilisées par une vue
.Superposition les vues ne sont pas une pratique idéale. Un point de vue fondateur peut changer, casser les enfants associés. Les requêtes elles-mêmes risquent de ne pas être optimisés pour la performance.
Insertion des valeurs dans une table temporaire signifie que vous devez supprimer des enregistrements existants ou utiliser la logique pour ajouter ou mettre à jour en conséquence. Cela signifie également que cela doit être effectué périodiquement pour maintenir synchronisés. Une vue indexée, AKA vue matérialisée, pourrait être une solution potentielle.
Je ne sais pas ce que vous entendez par vue insertion .
Peut-être une question de ce genre est ce que vous cherchez?
select Plant, count(*) as Count
from MyTable
group by Plant
order by Plant
Je suppose toutes vos vues sommaires accèdent à la même table, MyTable
. Si ce n'est pas le cas, vous aurez probablement besoin d'une procédure stockée avec une SQL dynamique pour générer ce que vous cherchez ...