Les tabulations sont interprétées très généreusement par la balise code, pour lever le doute je les remplace par des espaces avant de coller le code.
Les tabulations sont interprétées très généreusement par la balise code, pour lever le doute je les remplace par des espaces avant de coller le code.
Email : http://scr.im/waldar
quelqu'un pourrait m'aider à comprendre la requête ?
j'ai vraiment du mal. d'autant que l'opérateur apply est nouveau pour moi et les articles le concernant ne me semble pas super clair.
Kropernic
Je n'arrive pas à comprendre pourquoi on fait la comparaison suivante dans la table T
Je pense avoir compris l'opérateur APPLY (après une dizaine d'articles, ce n'est pas trop tôt) mais cette inégalité, elle m'échappe totalement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part CRD2.CRD_SERIAL > CRD.CRD_SERIAL
Je ne remets pas en doute son utilité (d'ailleurs sans elle la query ne marche bien sûr pas) mais je ne la comprends juste pas.
Si une bonne âme pouvait éclairer ma lanterne...
++
Kropernic
Pour chaque ligne de la table, je récupère la première rupture supérieur (d'où le >).
Je n'ai ensuite plus qu'a faire un MIN et un MAX par valeur de rupture
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
MCTS Database Development
MCTS Database Administration
pour mieux comprendre vous pouvez ajouter dans le SELECT la colonne , T.CRD_SERIAL...
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
MCTS Database Development
MCTS Database Administration
Il y a bien sûr moyen de se passer du OUTER APPLY...Je ne remets pas en doute son utilité (d'ailleurs sans elle la query ne marche bien sûr pas) mais je ne la comprends juste pas.
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
MCTS Database Development
MCTS Database Administration
OUTER APPLY me convient très bien
Pour ce qui est de la manière de procéder en français (en se détachant de ce qui est sql), j'ai bien compris ce que vous faisiez.
Mais j'ai toujours des problèmes pour comprendre quelle partie du code fait quoi.
Avec vos deux derniers messages, je comprends maintenant que la table de droite du OUTER APPLY sert à trouver les ruptures (le reste étant évident).
Par contre, je ne comprends toujours pas comment il fait... Je crois que quelque chose dans cet opérateur m'échappe...
Prend-il déjà en compte le filtre se trouvant dans la clause WHERE de la requête "principale" ?
En fait, j'essaie maintenant de reproduire le même genre de requête mais pour obtenir ce qui est disponible en stock. Mais jusque là, je fais chou blanc car je ne comprends pas comment obtenir la rupture justement.
J'arrive sans souci à avoir la liste des cartes qui sont présente. Ensuite j'applique les fonctions d’agrégation min et max. Il me manque la rupture...
Je bidouille des trucs mais vu que je ne comprends pas vraiment ce que je fais, je fais de la merde... Ce sont les mêmes tables qui entrent en jeu (sauf qu'on se moque des commandes maintenant). Seule table supplémentaire, celle qui stock la date de sortie du stock de l'entrepôt.
Sans me donner la requête complète (je tiens à comprendre et y arriver par moi-même), pourriez-vous me mettre sur la voie ?
Voici le DDL de cette table supplémentaire ainsi que celui de la vue que j'utilise pour ne pas devoir constamment utiliser 2 tables pour le stock.
Voici en gros, ce que je pense qu'il faut faire :
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 USE [GIFT_MANAGEMENT] GO /****** Object: Table [dbo].[T_ENTREPOT_STOCK_SORTIE_ESS] Script Date: 10/23/2012 10:19:02 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[T_ENTREPOT_STOCK_SORTIE_ESS]( [GFT_ID] [int] NOT NULL, [ESE_ID] [tinyint] NOT NULL, [ESS_DATE_OUT] [datetime] NOT NULL, CONSTRAINT [PK_T_ENTREPOT_STOCK_SORTIE_ESS] PRIMARY KEY CLUSTERED ( [GFT_ID] ASC, [ESE_ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], CONSTRAINT [AK_T_ENTREPOT_STOCK_SORTIE_ESS] UNIQUE NONCLUSTERED ( [GFT_ID] ASC, [ESS_DATE_OUT] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [dbo].[T_ENTREPOT_STOCK_SORTIE_ESS] WITH CHECK ADD CONSTRAINT [FK_T_ENTREPOT_STOCK_SORTIE_ESS_T_ENTREPOT_STOCK_ENTREE_ESE] FOREIGN KEY([GFT_ID], [ESE_ID]) REFERENCES [dbo].[T_ENTREPOT_STOCK_ENTREE_ESE] ([GFT_ID], [ESE_ID]) ON DELETE CASCADE GO ALTER TABLE [dbo].[T_ENTREPOT_STOCK_SORTIE_ESS] CHECK CONSTRAINT [FK_T_ENTREPOT_STOCK_SORTIE_ESS_T_ENTREPOT_STOCK_ENTREE_ESE] GO ------------------------------------------ USE [GIFT_MANAGEMENT] GO /****** Object: View [dbo].[V_ENTREPOT_STOCK_VES] Script Date: 10/23/2012 10:19:29 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE VIEW [dbo].[V_ENTREPOT_STOCK_VES] WITH SCHEMABINDING AS SELECT ESE.GFT_ID, ESE.ESE_ID, ESE.ESE_DATE_IN, ESS.ESS_DATE_OUT FROM DBO.T_ENTREPOT_STOCK_ENTREE_ESE ESE LEFT JOIN DBO.T_ENTREPOT_STOCK_SORTIE_ESS ESS ON ESE.GFT_ID = ESS.GFT_ID AND ESE.ESE_ID = ESS.ESE_ID GO
Je pense qu'il manque donc juste l'usage de l'opérateur APPLY mais je ne vois pas comment l'utiliser...
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 SELECT CRD.CRD_PREFIX, CRD.CRD_TYPE, MIN(CRD.CRD_SERIAL) AS 'MIN', MAX(CRD.CRD_SERIAL) AS 'MAX' FROM V_ENTREPOT_STOCK_VES VES INNER JOIN T_CARD_CRD CRD ON VES.GFT_ID = CRD.GFT_ID WHERE NOT VES.ESS_DATE_OUT IS NULL GROUP BY CRD.CRD_PREFIX, CRD.CRD_TYPE
Kropernic
Bon, j'y suis arrivé mais plus par bol et mimétisme que par compréhension je pense.
Voici la requête :
N.B. : J'ai externalisé la colonne CRD_TYPE dans une table des types de cartes. Ce qui donne la colonne clef étrangère TCA_ID de type smallint.
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
31
32
33
34 SELECT CRD.CRD_PREFIX, CRD.TCA_ID, T.CRD_SERIAL, MIN(CRD.CRD_SERIAL) AS 'MIN', MAX(CRD.CRD_SERIAL) AS 'MAX' FROM dbo.V_ENTREPOT_STOCK_VES VES INNER JOIN T_CARD_CRD CRD ON VES.GFT_ID = CRD.GFT_ID OUTER APPLY ( SELECT MIN(CRD_SERIAL) AS 'CRD_SERIAL' FROM dbo.V_ENTREPOT_STOCK_VES VES2 INNER JOIN T_CARD_CRD CRD2 ON VES2.GFT_ID = CRD2.GFT_ID WHERE NOT VES2.ESS_DATE_OUT IS NULL AND CRD.TCA_ID = CRD2.TCA_ID AND CRD2.CRD_SERIAL > CRD.CRD_SERIAL ) T WHERE CRD.TCA_ID = 9 AND VES.ESS_DATE_OUT IS NULL GROUP BY CRD.CRD_PREFIX, CRD.TCA_ID, T.CRD_SERIAL ORDER BY CRD.CRD_PREFIX, CRD.TCA_ID, [MIN]
Des commentaires ?
Kropernic
Je passe la discussion en Résolu mais je reviendrai probablement vous ennuyer avec d'autres questions à ce sujet.
Kropernic
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager