J'ai une table avec 60 colonnes sur un serveur SQL. Je dois supprimer temporairement les données de 10 à 15 colonnes pour une plage de dates non pour une table entière, de sorte que je puisse exécuter des requêtes de rapport, puis exécuter une autre requête de rapport après quelques jours avec des données supprimées retournées dans des colonnes. Les tableaux suivants illustrent ce que j'essaie d'atteindre.
Tableau A P>
|1 |2 |3 |4 |5 |....|55|56|57|58|59|60| --------------------------------------- |1 |2 |3 |4 |5 |....|0 |0 |0 |0 |0 |0 | |1 |2 |3 |4 |5 |....| 7| 8| 9|10|11|12|
3 Réponses :
Créez simplement une vue et utilisez-le pour le rapport:
create view v_t
select col1, col2, . . .
(case when <condition> then 0 else col55 end) as col55,
(case when <condition> then 0 else col56 end) as col56,
(case when <condition> then 0 else col57 end) as col57,
(case when <condition> then 0 else col58 end) as col58,
(case when <condition> then 0 else col59 end) as col59,
(case when <condition> then 0 else col60 end) as col60
from t;
Créer une vue compliquerait les choses que de nombreux clients ayant chacun une configuration de suppression de données de colonne différente.
@ user1534115 sonne plus comme un XY Problème . Vous avez temporairement "masquer" les valeurs réelles pour une période de temps pour certains rapports - mais qu'en est-il de tout le reste qui utilise la table? Fixer un synonyme pourrait être une option mais on dirait que vous ne voulez pas changer votre conception existante. Pas de solution facile.
Au lieu de supprimer temporairement les valeurs, déplacez-la à une autre table pendant quelques jours et remplissez à nouveau les valeurs de cette table, vous devez injecter que la logique dans votre signataire se demande en ajoutant une plage de date dans la déclaration de cas. Dites si vous souhaitez obtenir le résultat de la colonne 55 comme 0 pour la plage de date '2018-12-01' à '2009-12-31', utilisez la requête suivante
SELECT 1,2,3,4,5..,
CASE
WHEN CURRENT_DATE BETWEEN '2018-12-01' AND '2009-12-31' then 0 else 55
END As 55
FROM [tablename];
On dirait que je dois mettre à jour la description à nouveau car tout le monde pense que je souhaite supprimer toutes les données des colonnes sélectionnées. Je veux supprimer une partie des données sélectionnées, pas toutes les colonnes, alors supprimez les colonnes de Query par la vue n'est pas une option.
Comme cela a été commenté avant, les solutions les plus élégantes à votre problème impliqueraient d'utiliser une construction séparée telle que: - Créer une vue - Utiliser une procédure stockée - Ajout de filtrage dans le rapport lui-même p>
À ces options, je voudrais ajouter que vous pouvez utiliser la sécurité pour limiter les colonnes qu'un utilisateur peut accéder. Dans ce cas, vous pouvez limiter l'accès que l'utilisateur exécutant le rapport a à la table. Voir l'article ci-dessous pour plus de détails sur la façon dont vous pourriez continuer à faire ceci: p>
Utilisez une vue. Pourquoi le logiciel de rapport doit-il faire référence directement à la table?
Je dois supprimer des données des colonnes pour une plage de dates non pour les colonnes de table entier. Peut-être que j'ai besoin d'ajouter cela dans la description du problème.
Comme le dit Gordon, façonnez les données du rapport, ne modifiez pas les données, cela risquent, mauvais et terrible pour la performance.
Ou une procédure stockée comme alternative à une vue.
Renommez les colonnes, créez de nouvelles colonnes avec nom d'origine, copiez des données en fonction de vos conditions.
Avoir une vue simplifie votre problème, car vous pouvez créer une vue par client sans avoir à gaver les données d'origine.
S'il est vraiment impossible de façonner les données pour résoudre votre problème, envisagez de créer une autre table spécifiquement pour les rapports sur lesquels vous copiez les données requises pour le rapport. De cette façon, vous ne jouez pas avec des données en direct.