Supprimer les lignes en double d’une table SQL Server

bonjour,

Plusieurs fois, notre base de données contient des lignes en double qui peuvent être filtrées en utilisant certaines colonnes.  Un développeur devait supprimer ces lignes dupliquées avec une requête TSQL  nous  avons vu ensemble dans l’ancien article comment le faire a travers SSIS a travers le composant Tri Suppression les lignes dupliquées avec SSIS

Ici, je montre un moyen simple de supprimer les lignes en double

j’utilise le table [ProductCategory] du base AdventureWorks 2014

Sans titre

Le CTE commence par le mot « With » suivi d’un nom d’expression et de noms de colonnes. Ensuite, la requête de sélection qui remplit l’expression. Nous pouvons avoir plusieurs ensembles d’expression séparés par une virgule suivie de l’instruction finale. Nous n’entrons pas dans les détails de CTE car cela est hors de portée de cet article. Voyons comment nous pouvons utiliser CTE pour supprimer les lignes en double. Regardez le code ci-dessous:

with cte as
(
select
row_number()over (partition by ParentProductCategoryID,Name order by ParentProductCategoryID ) as classement,
 ParentProductCategoryID,Name
 from [SalesLT].[ProductCategory]
 where ParentProductCategoryID is not null
)delete from cte where classement >1

Autre Méthode

delete from SalesLT.ProductCategory
   where ParentProductCategoryID in
   (select ParentProductCategoryID from SalesLT.ProductCategory  group by ParentProductCategoryID
    having
    count(*) >1

Après l’exécution, ces codes affichent les données de la table, toutes les lignes uniques sont présentes

les deux méthode Fonctionne correctement mais si en fait une petit comparaison en terme performance avec le CTE il est plus performant  il  a le coût le plus bas

En supprimant les données et en examinant à nouveau les plans d’exécution, nous constatons que le plus rapide est la première commande DELETE et que la plus lente est la dernière, comme prévuSans titre.png

Requéte Table calendrier sur 100 années

bonjour

Une table de calendrier peut être extrêmement utile surtout en développement et pour faire du jointure avec d’autre table

ci joint une petit requête qui vous  permettra de crée un table calendrier sur x temps

Quelque remarque

*set datefirst 1 :le premier jour de la semaine est un lundi et non plus un dimanche msdn

*on définit une date de début et une date de fin

*where dateadd(day,n,@stardate)<=@endate: ce ci  nous permettre d'incrémenter de 1 jour en 1 jour la variable n pour pouvoir à terme arrêter la boucle

*le colonne type_jour indiquant si le jour est travaillé ou non

set datefirst 1 declare @stardate date ='2000-01-01'
declare @endate date ='2100-01-01'; 
with cte as (select 1 as n ,@stardate as date_jour, 
convert(varchar(10),@stardate,131)as date_format_hijri, 
datepart(day,@stardate)as num_jour,
datepart(weekday,@stardate)as num_jour_semaine, 
datepart(dayofyear,@stardate)as num_jour_année, 
datepart(week,@stardate)as num_semaine,
datepart(QUARTER,@stardate)as trimesstre,
datename(weekday,@stardate)as nom_jour, 
datename(month,@stardate)as nom_mois,
year(@stardate)as année, case when datepart(weekday,@stardate)in(6,7)then 'weekend' else 'no_weekend' end as type_jour
union all 
select n+1,
dateadd(day,n,@stardate),
convert(varchar(10),dateadd(day,n,@stardate),131), 
datepart(day,dateadd(day,n,@stardate)), 
datepart(weekday,dateadd(day,n,@stardate)), 
datepart(dayofyear,dateadd(day,n,@stardate)),
datepart(week,dateadd(day,n,@stardate)), 
datepart(QUARTER,dateadd(day,n,@stardate)),
datename(weekday,dateadd(day,n,@stardate)),
datename(month,dateadd(day,n,@stardate))
,year(dateadd(day,n,@stardate)), case when datepart(weekday,dateadd(day,n,@stardate))in(6,7)then 'weekend' else 'no_weekend' end 
from cte where dateadd(day,n,@stardate)<=@endate )
select * from cte OPTION (MAXRECURSION 0) 

sans-titre

ce ci est les jours de 2000 à 2100 inclus

bonne chance A+

Fonction EOMONTH

bonjour

Une jolie Fonction a était introduit avec la version SQL Server 2012 cette Fonction est Appelé EOMONTH il permet de retourner le dernier jour du mois  pour une date saisie précédamment

Il est très facile de le comprendre

Ci joint leur Syntaxe

EOMONTH(, )

EOmonth

il s’agit d’une fonction très intéressante  donc  n’hésitez pas à utiliser dans vos script

cordialement

Problème requête récursive

bonjour a tous

Si vous rencontrer ce message d’erreur lorsque vous écrire  votre requête récursive

L’instruction a été terminée. La récursivité maximale 100 a été épuisée avant la fin de l’instruction.

Voici le message d’erreur :

Msg 530, Niveau 16, État 1, Ligne 5
L’instruction a été terminée. La récursivité maximale 100 a été épuisée avant la fin de l’instruction

n’ayez pas peur, par défaut le nombre de cycles de récursion est limité à 100. Vous pouvez outre passer cette limite en fixant vous-même la valeur à l’aide de la clause OPTION (MAXRECURSION n), qui doit figurer en dernier dans la requête

nous pouvons définir le niveau de récursivité, de sorte que cela ne va pas infinie

Lorsque 0 est spécifiée, aucune limite est appliquée

bonne journée

Convertir un number in year, month, day, hour, minute and second

bonjour

vous avez  un nombre entier qui représente les secondes ( secondes ) une partie du temps vous avez  besoin de le convertir ce nombre entier en année, mois, jours , heures, minutes et secondes

Examples:

100 Seconds – 0 year(s) 0 month(s) 0 day(s) 0 hour(s) 1 minute(s) 40 second(s)

3600 Seconds – 0 year(s) 0 month(s) 0 day(s) 1 hour(s) 0 minute(s) 0 second(s)

DECLARE @VARDT DATETIME = DATEADD(SECOND, 35110011, 0)
SELECT CAST(DATEDIFF(YEAR, 0, @VARDT) AS VARCHAR(10)) + ' year(s) ' + CAST(DATEPART(MONTH, @VARDT) – 1 AS VARCHAR(2)) + ' month(s) '
+ CAST(DATEPART(DD, @VARDT) – 1 AS VARCHAR(2)) + ' day(s) ' + CAST(DATEPART(HOUR, @VARDT) AS VARCHAR(2)) + ' hour(s) '
+ CAST(DATEPART(MINUTE, @VARDT) AS VARCHAR(2)) + ' minute(s) ' + CAST(DATEPART(SECOND, @VARDT) AS VARCHAR(2)) + ' second(s)'

ou a travers ce code

DECLARE @VARDT DATETIME = DATEADD(SECOND, 35110011, 0)
SELECT CAST(DATEDIFF(YEAR, 0, @VARDT) AS VARCHAR(10)) + ' year(s) '+ CAST(DATEPART(MONTH, @VARDT) - 1 AS VARCHAR(2)) + ' month(s) '
+ CAST(DATEPART(DD, @VARDT) - 1 AS VARCHAR(2)) + ' day(s) '+ CAST(DATEPART(HOUR, @VARDT) AS VARCHAR(2)) + ' hour(s) '
+ CAST(DATEPART(MINUTE, @VARDT) AS VARCHAR(2)) + ' minute(s) '+ CAST(DATEPART(SECOND, @VARDT)AS VARCHAR(2)) + ' second(s)'

cordialement

Différence entre RANK () et ROW_NUMBER ()

bonjour

Quelle est la différence entre ROW_NUMBER, RANK et DENSE_RANK Lequel utiliser? Ceci est un question très commune dans l’esprit de SQL Server  vu que ces fonctions sont similaires                        

Dans SQL Server, il y a 3 fonctions de classement :

  1. ROW_NUMBER :Renvoie un nombre unique pour chaque ligne commençant à 1. Pour les lignes qui ont des valeurs en double, les numéros sont attribués arbitrale.
  2. RANK:Attribue un numéro unique pour chaque ligne commençant par 1, sauf pour les lignes qui ont des valeurs en double, dans ce cas, le même classement est attribué et un écart apparaît dans la séquence pour chaque classement en double
  3.  DENSE_RANK:Retourne le rang de lignes au sein de la partition d’un ensemble de résultats, sans aucune lacune dans le classement. Le rang d’une ligne est un plus le nombre de rangs distincts qui viennent avant la ligne en question.

Nous allons voir la différence entre ces 3 fonctions basées sur un exemple

CREATE TABLE dbo.Grades
(Names VARCHAR(1),
Grade INT )                                                           INSERT INTO dbo.Grades                                                VALUES ('A',100),('B',90),('C',80),('D',70),('E',70),('F',60)         
 SELECT Names,
     Grade,
     ROW_NUMBER () OVER (ORDER BY Grade DESC) as ROW_NUMBER,
       RANK () OVER (ORDER BY Grade DESC) as RANK,
       DENSE_RANK () OVER (ORDER BY Grade DESC) as DENSE_RANK,
       NTILE(3) OVER(ORDER BY Grade desc) AS NTILE
FROM dbo.Grades
Sans titre


Comme vous pouvez le voir, ROW_NUMBER retourne un numéro de série pour chaque ligne, sans aucune lacune. Les numéros renvoyées par la fonction de DENSE_RANK ne pas avoir des lacunes et ont toujours rangs consécutifs. La fonction de RANK ne renvoie pas toujours entières consécutives cordialement

remplacer les valeurs null sql

bonjour

On va voir dans article  comment remplacer les valeur Nul par d’autre valeur

on va utiliser pour cela 3 méthode (2 en T SQL) et une en utilisant SSIS

* fonction COALESCE                                                                                                                       fonction ISNULL                                                                                                                                        * Expression REPLACENULL (ssis 2012 –>2016) 

Démonstration

CREATE TABLE [dbo].[T_test](
[test1] [int] NULL,
[test2] [int] NULL,
[test3] [int] NULL,
[test4] [int] NULL,
[test5] [int] NULL
) ON [PRIMARY]
GO

INSERT INTO T_test VALUES (1, 2, 3, 4, 5)                             INSERT INTO T_test VALUES (NULL, 2, 3, 4, 5)                          INSERT INTO T_test VALUES (NULL, 2, NULL, 4, NULL)                    INSERT INTO T_test VALUES (NULL, NULL, NULL, 4, 5)        
select isnull(test1,0),isnull(test2,0),isnull(test3,0),isnull(test4,0),isnull(test5,0) from T_test
 select coalesce(test1,0),coalesce(test2,0),coalesce(test3,0),coalesce(test4,0),coalesce(test5,0) from T_test

Sans titre

une petit remarque ISNULL est spécifique à SQL Server alors que COALESCE est conforme à la norme ANSI

Voici maintenant comment nous allons remplacer les valeurs NULL en utilisant Dérivé Transformation de colonne ,SSIS 2012 a introduit une nouvelle Expression REPLACENUL , avec  les versions précédentes de SSIS, nous devons utiliser  les expressions  else ISNULL                              L’exemple suivant remplace toute valeur NULL dans une colonne de base de données avec la valeur (0).Cette fonction est surtout utilisé dans les modèles de colonne dérivée communes                dans lequel vous souhaitez remplacer les valeurs NULL avec autre chose

ci joint une petit démonstration

colone_dérivé Sans titre

Comme nous pouvons le voir  les valeurs NULL sont remplacés par « 0 »

Sans titreSans titre

cordialement

order by newid()

bonjour a tous

SI Vous souhaitez sélectionner un échantillon aléatoire de lignes d’une grande table avec beaucoup de lignes C’est  order by newid()

La méthode standard  pour obtenir des lignes aléatoires à partir d’une petite table est d’utiliser order by newid() cette dernière va trier les enregistrements au hasard

select * from RessHum_Conge 
where dt_cuf>dateadd(day,-10,current_timestamp) 
order by newid()

la fonction NEWID, qui génère un identifiant unique global (GUID) en mémoire pour chaque ligne. Par définition, le GUID est unique et assez aléatoire, vous obtenez un ordre aléatoire des lignes de la table

cordialement

Comment pouvez-vous utiliser IIf dans Transact-SQL?

bonjour

Une nouvelle fonction logiques a était introduits, à partir de SQLServer2012 C’est la Fonction   « IIF » qui peuvent prochainement remplacer la fonction case when then 

Syntaxe  :IIF (boolean_expression, true_value, valeur_faux)  Le premier paramètre est l’instruction conditionnelle. Le deuxième paramètre est la valeur de retour si la condition est remplie. . Le troisième paramètre est la valeur retourné

Examples:

declare @a int ,@b int 
set @a=10
set @b=20
select 
case 
when @a<@b then 'true'
else 'false'
end as test 
GO
declare @a int ,@b int 
set @a=10
set @b=20
SELECT IIF(@a<@b,'true','false') as test

Comment désactiver et activer une contrainte SQL server ?

bonjour a tous

Parfois, il est utile de désactiver une ou plusieurs contraintes sur une table ,nous pouvons désactiver la contrainte en utilisant la commande ALTER TABLE

– Désactivez toutes les contraintes pour une base de donnée                                                               EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"                                                                                - activez toutes les contraintes pour une  base de donnée        
EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

— Désactiver tous les contraintes de table                                                                                        ALTER TABLE Non du table  NOCHECK CONSTRAINT ALL
– Activer  tous les contraintes de table
ALTER TABLE Non du table   CHECK CONSTRAINT ALL

–Désactiver unique contrainte
ALTER TABLE yourtablename NOCHECK CONSTRAINT YourConstraint
– -Activer seule contrainte
ALTER TABLE yourtablename CHECK CONSTRAINT YourConstraint

cordialement