IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

probleme modification structure table


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 200
    Points : 52
    Points
    52
    Par défaut probleme modification structure table
    Bonjour,

    j'ai un petit probleme, débutant sur sql server je commence par creer un base de données puis une table
    j'aimerai creer une table jour , contenant , jour mois années et id_journee, de maniere a que mes autre table ai un id_journee (pour pouvoir ensuite fire des requete par jour.

    tout d'abord est-ce cohérent de faire comme ça ou mieu vaut il dans chaque table ajouter les colonne jour mois année? parce que la sa imposerai dans mes recuperation e données de verifier si la journee existe et si tel est le cas, transformer la date en id journee.. je sais pas si c la meilleur solution

    ensuite, j'ai voulu un champ de ma table, un message d'erreur est apparu:
    Images attachées Images attachées  

  2. #2
    Membre à l'essai
    Profil pro
    Responsable de service informatique
    Inscrit en
    Mars 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 12
    Points : 14
    Points
    14
    Par défaut
    Salut livinho38,
    Je pense qu'il vaut mieux en effet inclure une colonne qui contient une date dans une de tes tables ensuite lorsque tu fera tes requete en fonction de la date il suffira d'utiliser les jointures entre les tables tu peux tres bien ecrire un truc du style:
    select Table1.champ1,table2.champ2, table2.champ3
    from Table1
    inner join table2 on Table1.champ7=table2.champ4
    where Table1.ChampDate="01/01/2009"

    et cela t'evite de faire une table avec toutes les dates de l'année, le fait de gérér si elle est bisextille ou pas etc...

  3. #3
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 200
    Points : 52
    Points
    52
    Par défaut
    tout d'abord merci de ta rep,

    je recapitule (pr etre sur d'avoir bien compris)
    je vais recupérer des données de fichier csv (tetre excel et xml)
    dans les lignes ke je recupere, j'ajoute la date dans une table date, ensuite je recupere l'id de la date, et jajoute le reste des données dans d'autres tables (ex table debits, table meteo)
    come sa lors des requette je joins les table en fonction de la date, et je dit (en gros),
    select debit, meteo , from table1 et 2 where table3.date = "01-01-2008"

    ce serait une bonne solution?

    il es possible d'entrer les données de cette maniere avec visual studio? parce que jai unikemen tester pr le momen d'ajouter des donées des fichier csv directement ds la table avec simplement une recherche afin de voir si les ligne etait deja présente ou non.
    voilou

  4. #4
    Membre à l'essai
    Profil pro
    Responsable de service informatique
    Inscrit en
    Mars 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 12
    Points : 14
    Points
    14
    Par défaut
    Je ne vois pas trop l'intérêt de créer une table expres pour les dates en fait.
    si dans ton fichier excel tu as des infos sur la meteo et debit et que ces infos sont liées entre elles il suffit d'ajouter une colonne date dans une des deux tables et tu feras sont select sur les 2 tables avec une clause where sur la colonne date.

    en fait tu auras
    table1: id, champ1, champdate
    table2: id, clé etrangere de la table 1, champ1
    et tu fait ta requete comme precedement.

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Créer une table de dates est avantageux si vous cherchez par exemple toutes les lignes de votre table pour une semaine de l'année ou pour tous les premiers lundis du mois.
    A ce titre référencer la valeur de la clé d'une table de dates n'est donc pas une mauvaise idée
    Tout dépend donc tu type de recherches que vous devez effectuer ensuite

    @++

  6. #6
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 200
    Points : 52
    Points
    52
    Par défaut
    par la suite je cherche a pouvoir faire des reportings
    notamment rechercher tel jour le débit d'une rmachine, ensuite pouvoir recherche le même jour l'état de la méteo, ou encor la consommation électrique du jour. qui seront surement dans des tables différentes.
    mais pour le moment je ne sais pas trop comment creer mes tables de manière à que ça soit optimiser pour faire cela.

    pour le moment j'utilise uniquement des imports dans les table comme ceux en piece jointe : image : 2.jpg pour ajouter directedement des connées d'un fichier CSV, image 1.jpg pour ajouter des données en verifiant qu'elles ne soit pas déja presente dans la table.

    et le probleme c'est que du cou la je comparer par raport a la colone : jour, mois , année , heure ...
    il faut donc kan j'ajoute une ligne, allée dans la table journee, pour creer un id journee? ensuite recuperer cet ID et le metre lui dans la table debit par exemple?
    Images attachées Images attachées   

  7. #7
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Comme je vous l'ai dit, cela dépend des recherches que vous devrez effectuer par la suite.
    Si vous ne faites des recherches que par journées ou par plages de journées (BETWEEN uneDate AND uneAutreDate) comme vous semblez l'indiquer, et que vous êtes certain que cela ne changera jamais (on ne vous demandera jamais par exemple de rechercher la consommation électrique moyenne tous les mardis de la 2e semaine de chaque mois), alors vous pouvez utiliser ce que vous propose loutheo.

    Si en revanche vous pensez que l'on peut vous demander de rechercher, par exemple le débit d'une machine pour la deuxième semaine de chaque mois, alors il sera plus intéressant pour vous d'avoir une table de dates.
    Il n'est nul besoin d'insérer la date et de récupérer la valeur de la clé primaire de la table.
    Vous devriez plutôt générer une table de dates, avec toutes les informations dont vous avez besoin dedans.
    Dites-moi quelle version de SQL Server vous utilisez que je vous montre comment on peut créer une table de dates ...

    @++

  8. #8
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 200
    Points : 52
    Points
    52
    Par défaut
    d'accord ça commence a être plus clair,

    maintenant, si cela est faisable (sans etre un expert) je pense qu'il serait beaucoup plus intéressant de pouvoir compter sur la 2eme methode (c a d de pouvoir faire des requête sur tel ou tel semaine comme ça je pourrait par exemple mettre les dernière semaine de décembre etc etc )

    j'utilise SQL server 2008 version entreprise.

    maintenant j'ai toujours du mal a comprendre comment je vais rentrer ces données dans ma base (je recupere les date, je recupere l'id correspondant, pui j'insere toutes mes données.)

    merci bcp en tt cas pour le coup de main!
    oliv

  9. #9
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Non, ne rentrez pas les dates à la main. Je vous ai tout fait
    Voici la table de dates :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE TbDates
    (
    	date DATETIME NOT NULL CONSTRAINT PK_TbDates_date PRIMARY KEY,
    	annee AS (YEAR(date)) PERSISTED NOT NULL,
    	mois AS(MONTH(date)) PERSISTED NOT NULL,
    	semaineDansAnnee AS(DATEPART(week, date)) PERSISTED NOT NULL,
    	semaineDansLeMois AS(DATEPART(week, date) - DATEPART(week, DATEADD(day, -DATEPART(day, date) + 1, date)) + 1)  PERSISTED NOT NULL,
    	jourDansAnnee AS (DATEPART(dayofyear, date)) PERSISTED NOT NULL,
    	jourDansMois AS(DAY(date)) PERSISTED NOT NULL,
    	jourDansSemaine TINYINT NOT NULL CONSTRAINT CHK_TbDates_jourDansSemaine CHECK(jourDansSemaine BETWEEN 0 AND 7),
    )
    GO
    Voici le déclencheur qui va permettre de valuer la colonne jourDansSemaine (DATEPART(weekday, date) n'est pas déterministe, donc elle ne peut pas être utilisée dans la spécification d'une colonne calculée)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    -------------------------------------------------------------------------
    -- 10/07/2009	ELSUKET		déclencheur qui calcule le jour de la semaine
    --							pour la table dbo.TbDates
    -------------------------------------------------------------------------
    CREATE TRIGGER TR_A_I_TbDates
    	ON dbo.TbDates
    	AFTER INSERT
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	UPDATE dbo.TbDates
    	SET jourDansSemaine = DATEPART(weekday, D.date)
    	FROM dbo.TbDates AS D
    	JOIN INSERTED AS I
    		ON D.date = I.date
    END
    GO
    Et voici la procédure stockée qui génère tous les jours d'une année :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    ---------------------------------------------------------------------------------
    -- 10/07/2009	ELSUKET		Procedure de génération de tous les jours d'une année
    ---------------------------------------------------------------------------------
    ALTER PROCEDURE Ps_GenereDatesAnnee
    	@annee SMALLINT
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	DECLARE @dateDeb DATETIME,
    			@dateFin DATETIME
     
    	SELECT @dateDeb = CAST(CAST(@annee AS VARCHAR) + '0101' AS DATETIME),
    			@dateFin = CAST(CAST(@annee AS VARCHAR) + '1231' AS DATETIME)
     
    	-- Si l'année est bissextile, recursion 366
    	;WITH
    		CTE_DATES AS
    		(
    				SELECT @dateDeb AS Date
    			UNION ALL
    				SELECT Date + 1
    				FROM CTE_DATES
    				WHERE Date <= @dateFin
    		)
    	SELECT Date
    	FROM CTE_DATES
    	WHERE Date <= @dateFin
    	OPTION (MAXRECURSION 366)
    END
    Voici un exemple d'insertion des jours de l'année 2008 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO dbo.TbDates (date)
    EXEC dbo.Ps_GenereDatesAnnee 2008
    Les autres colonnes sont automatiquement calculées.

    Pour voir ce que contient la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT date, annee, mois, semaineDansAnnee, semaineDansLeMois, jourDansAnnee, jourDansSemaine, jour
    FROM dbo.TbDates
    Dès lors si vous voulez chercher quelque chose dans une table dans les jours de la semaine 31 de 2008, il vous suffit d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT T.maListeDeColonnes
    FROM dbo.maTable AS T
    JOIN dbo.TbDates AS D
    	ON T.colonneDate = D.date
    WHERE D.semaineDansAnnee = 31
    AND D.annee = 2008
    Si vous voulez chercher quelque chose dans une table dans les jours de la deuxième semaine de chaque mois de l'année 2008:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT T.maListeDeColonnes
    FROM dbo.maTable AS T
    JOIN dbo.TbDates AS D
    	ON T.colonneDate = D.date
    WHERE D.semaineDansLeMois = 2
    AND D.annee = 2008
    Il vous suffit donc de stocker dans votre table les données avec leur date.

    @++

  10. #10
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 200
    Points : 52
    Points
    52
    Par défaut
    sa ma l'air compliquer tout sa ^^ non je verrai lundi au boulot du coup voir ce que ça donne.

    mais je me rend compte que je ne t'ai pas donné une donnée importante, le format de ma date, en effet moi j'ai "janv, fev, mar, avr ... un truc du genre
    et je sais aps si je peu extraire d'un autre format,
    ce que tu m'as fait est adaptable à ça ou non ?
    en tout cas merci bien!! je mettrai tout sa dans SQL Server!

  11. #11
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 200
    Points : 52
    Points
    52
    Par défaut
    Bonjour,

    juste pour vous signaler que je n'arrive pas à faire ce que vous m'avez décris...
    lors du create table j'ai bien l'erreur , mais du coup je sais pas ce qu'il faut faire, pourriez vous m'indiqué la procedure?

    aussi en rapport à mon premier message, ceci est-il adaptable a un forma de date comme celui ci :
    colonne de mon fichier CSV :

    Heure d'introduction Jours de semaine Jour du mois Mois Année Trimestre Semaine calendaire Jour de l année Heure
    30.11.2008 00:00 Dim. 30 Nov. 2008 Q. 4 Semaine 49 335 08:00
    02.12.2008 00:00 Mar. 2 Déc. 2008 Q. 4 Semaine 49 337 08:00

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    ATTENTION : ceci est faux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    semaineDansAnnee AS(DATEPART(week, date))
    En effet cela donne le n° de semaine du système US, mais pas du système français, qui repose sur la norme internationale ISO....

    Vos données seront fausses !

    Voir :http://baptiste-wicht.developpez.com...-sql/datetime/
    Fonction F_ISO_WEEK

    Si vous êtes en 2008 : DATEPART(ISO_WEEK, MaDate).

    A +

  13. #13
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 200
    Points : 52
    Points
    52
    Par défaut
    En fait pour le moment je n'arrive rien a faire fonctionner

    et je me demande si ceci est adaptable par rapport aux données que j'ai copié au dessus.
    puisque moi par exemple j'ai : Semaine 44 , et non juste 44
    de meme pour le mois j'ai Dec. et non 12

    donc je sais pas si pour creer mon appli je part bien en partant comme cela

  14. #14
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    ors du create table j'ai bien l'erreur , mais du coup je sais pas ce qu'il faut faire, pourriez vous m'indiqué la procedure?
    Quel est le libellé de l'erreur ? Je viens de re-tester le script de création de la table, il fonctionne chez moi.
    Pour adapter l'intégration du fichier CSV à votre base de données, vous aurez probablement besoin d'un package SQL Server Integration Services ...

    Merci SQLPro d'avoir relevé mon erreur, je pensais que ce calcul là dépendait de SET LANGUAGE ...

    @++

  15. #15
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 200
    Points : 52
    Points
    52
    Par défaut
    voici l'intitulé de l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg*4936, Niveau*16, État*1, Ligne*1
    La colonne calculée 'semaineDansAnnee' dans la table 'TbDates' ne peut pas être persistante parce que la colonne n'est pas déterministe.
    pour reprendre, voici les entete(+une premiere ligne dexemple) de 2 de mes fichier CSV :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Clôture de jour depuis	Clôture de jour jusqu à	Jours de semaine	Jour du mois	Mois	Année	Trimestre	Semaine calendaire	Jour de l année	Montées	Clients	Clients Changeurs	Points débités	Montées débitées	Jours débités	Minutes débitées	Crédit de temps	Débits de temps à partir du début de Répartition	Débits de temps à partir de l'introduction
    25.10.2008 00:00	25.10.2008 00:00	Sa.	25	Oct.	2008	Q. 4	Semaine 43	299	75	31	1	0	0	0	0	0	31000	14769
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Nom RM	Société Caisse	Heure d'introduction	Jours de semaine	Jour du mois	Mois	Année	Trimestre	Semaine calendaire	Jour de l année	Heure 	Montées	Attribut de réserve 6 (nombre)
    AH DMC G1	ALPE D'HUEZ	30.11.2008 00:00	Dim.	30	Nov.	2008	Q. 4	Semaine 49	335	08:00	2	8
    je vous met ceci afin que vous puissiez me dire votre avis quant a la création des tables des liaisons...

    il serait interressant comme dans date de separer une table RM qui contient le numéro et le nom de la RM, ensuite ds ma table concernant le debit, les ouverture etc etc je prendré du cou l'id, le gros probleme que j'ai c'est donc de recuperer ces données a partir du csv, aler entrer les données des RM dans la table RM, recuperer l'id correspondant, et ensuite d'ajouter les autre données dans une autre table avec l'id ce cou la de la RM, est-ce possible?

  16. #16
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 200
    Points : 52
    Points
    52
    Par défaut
    petite précision, après avoir regarder 2 3 fichiers CSV j'ai vu que ceu-ci contienne notamment les colonnes (format
    jour de la semaine : lu. ; mar. ; mer. ; jeudi ; ven. ; Sa. ; dim.;
    jour du mois : 1, 2 , 3 ....
    mois : Oct. ; nov. ; dec. ;
    années : 2008 ; 2009
    trimestre : Q.4 ; Q.5 ...
    semaine calendrier : Semaine 43 ; Semaine 44...
    jour de l'année : 299 ; 300

    voila , donc le pb est tjs le suivant, ece possible de creer une table centrale ou ece que je suis obligé de garder toute ces colonne dans chaque table et dans ce cas ne pas avoir de liens entre ces tables ??

    de meme, j'ai une table qui contient une colonne 'Nom RM' et 'numero RM' et dans un autre fichier uniquemetn 'nom Rm' , ece util et faisable de créer une table RM qui contient le nom et le num et du cou je transforme le nom par l'id quand je rentre mes données ? est-ce pertinant?
    je sais pas si je suis bien clair.

    je vous remercie d'avance

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/04/2010, 14h07
  2. modification structure table liée access 2003
    Par olivierbro dans le forum Windows
    Réponses: 0
    Dernier message: 23/04/2008, 15h13
  3. 2 tables sources pour un fomulaire: probleme modif!
    Par kleenex dans le forum Access
    Réponses: 9
    Dernier message: 13/01/2006, 15h27
  4. Probleme avec une table vide
    Par king dans le forum Bases de données
    Réponses: 5
    Dernier message: 20/03/2004, 14h24
  5. Réponses: 3
    Dernier message: 28/09/2003, 17h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo