OVH Cloud OVH Cloud

Tableau à double entrée :comment faire ?

3 réponses
Avatar
Oliv'
Bonjour à tous,
J'ai actuellement un progiciel qui utilise SQLSERVER , dans celui ci je peux
tarifer soit en requêtes SQL ou par l'intermédiaire d'un classeur Excel.

Je voudrais savoir s'il est possible de reproduire dans une requete SQL ceci
:
soit sous excel un tableau à double entrée avec en intersection la valeur
dont j'ai besoin

capital | Nature|Resultat
2000 | 2 |642
Capital/nature |1 |2 |3
0 |500 |602 |705
1000 |550 |622 |765
2000 |600 |642 |825
3000 |650 |662 |885
4000 |700 |682 |945


La formule sous resultat est =RECHERCHEV(A2;A3:D8;EQUIV(B2;A3:D3;0);1)
capital est en A1.
945 en D8.

La recherche dans la colonne A se fait en valeur approchée et je cherche
l'intersection avec la ligne 3 en valeur exacte.

Bien sûr mon tableau réél est bien plus grand.
Merci d'avance pour vos idées.
Oliv'

3 réponses

Avatar
Oliv'
Bonjour à tous,
Histoire de faire avancer le schmillblick je me répond ;-)
Est ce que la seule solution pour reproduire cela en SQL serait :


declare @capital decimal, @nature int

set @capital = 1350
set @nature = 3

Select resultat = case when @capital >@00 then

case @nature when 3 then 945
when 2 then 682
when 1 then 700 end
when @capital >= 3000 then
case @nature when 3 then 885
when 2 then 662
when 1 then 650 end

when @capital >= 2000 then
case @nature when 3 then 825
when 2 then 642
when 1 then 600 end
when @capital >= 1000 then
case @nature when 3 then 765
when 2 then 622
when 1 then 550 end
when @capital >= 0 then
case @nature when 3 then 705
when 2 then 602
when 1 then 500 end
end

MErci d'avance pour votre avis
Oliv'


"Oliv'" <(supprimerceci) a écrit dans le
message de news: eE$fi$
Bonjour à tous,
J'ai actuellement un progiciel qui utilise SQLSERVER , dans celui ci je peux
tarifer soit en requêtes SQL ou par l'intermédiaire d'un classeur Excel.

Je voudrais savoir s'il est possible de reproduire dans une requete SQL ceci
:
soit sous excel un tableau à double entrée avec en intersection la valeur
dont j'ai besoin

capital | Nature|Resultat
2000 | 2 |642
Capital/nature |1 |2 |3
0 |500 |602 |705
1000 |550 |622 |765
2000 |600 |642 |825
3000 |650 |662 |885
4000 |700 |682 |945


La formule sous resultat est =RECHERCHEV(A2;A3:D8;EQUIV(B2;A3:D3;0);1)
capital est en A1.
945 en D8.

La recherche dans la colonne A se fait en valeur approchée et je cherche
l'intersection avec la ligne 3 en valeur exacte.

Bien sûr mon tableau réél est bien plus grand.
Merci d'avance pour vos idées.
Oliv'
Avatar
Fred BROUARD
Le mieux serait de créer des tables de tranche et de nature de la sorte :

CREATE TABLE T_TRANCHE_CAPITAL_TRC
(TRC_ID INTEGER NOT NULL PRIMARY KEY,
TRC_MAX_CAPITAL DECIMAL(16,2) NOT NULL)

INSERT INTO T_TRANCHE_CAPITAL_TRC VALUES (1, 0)
INSERT INTO T_TRANCHE_CAPITAL_TRC VALUES (2, 1000)
INSERT INTO T_TRANCHE_CAPITAL_TRC VALUES (3, 2000)
INSERT INTO T_TRANCHE_CAPITAL_TRC VALUES (4, 3000)
INSERT INTO T_TRANCHE_CAPITAL_TRC VALUES (5, 4000)

CREATE TABLE T_NATURE_NTR
(NTR_ID INTEGER NOT NULL PRIMARY KEY,
NTR_VAL INTEGER NOT NULL)

INSERT INTO T_NATURE_NTR VALUES (1, 1)
INSERT INTO T_NATURE_NTR VALUES (2, 2)
INSERT INTO T_NATURE_NTR VALUES (3, 3)

CREATE TABLE TJ_CAPITAL_NATURE_CPN
(TRC_ID INTEGER NOT NULL FOREIGN KEY REFERENCES CAPITAL_TRC (TRC_ID ),
NTR_ID INTEGER NOT NULL FOREIGN KEY REFERENCES T_NATURE_NTR (NTR_ID),
CPN_VAL INTEGER NOT NULL,
CONSTRAINT PK_CPN PRIMARY KEY (TRC_ID,NTR_ID))

INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (1, 1, 500)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (1, 2, 602)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (1, 3, 705)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (2, 1, 550)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (2, 2, 622)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (2, 3, 765)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (3, 1, 600)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (3, 2, 642)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (3, 3, 825)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (4, 1, 650)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (4, 2, 662)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (4, 3, 885)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (5, 1, 700)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (5, 2, 682)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (5, 3, 945)

Dès lors une simple requête SQL suffit :

SELECT CPN_VAL
FROM T_TRANCHE_CAPITAL_TRC TRC
INNER JOIN TJ_CAPITAL_NATURE_CPN CPN
ON TRC.TRC_ID = CPN.TRC_ID
INNER JOIN T_NATURE_NTR NTR
ON CPN.NTR_ID = NTR.NTR_ID
WHERE TRC_MAX_CAPITAL = (SELECT MAX(TRC_MAX_CAPITAL)
FROM T_TRANCHE_CAPITAL_TRC
WHERE TRC_MAX_CAPITAL<1350
AND NTR_VAL = 3


La conclusion est simple : apprendre le langage SQL !

Mon site comme mon bouquin peuvent t'y aider...

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************



Oliv' a écrit:
Bonjour à tous,
Histoire de faire avancer le schmillblick je me répond ;-)
Est ce que la seule solution pour reproduire cela en SQL serait :


declare @capital decimal, @nature int

set @capital = 1350
set @nature = 3

Select resultat = case when @capital >@00 then

case @nature when 3 then 945
when 2 then 682
when 1 then 700 end
when @capital >= 3000 then
case @nature when 3 then 885
when 2 then 662
when 1 then 650 end

when @capital >= 2000 then
case @nature when 3 then 825
when 2 then 642
when 1 then 600 end
when @capital >= 1000 then
case @nature when 3 then 765
when 2 then 622
when 1 then 550 end
when @capital >= 0 then
case @nature when 3 then 705
when 2 then 602
when 1 then 500 end
end

MErci d'avance pour votre avis
Oliv'


"Oliv'" <(supprimerceci) a écrit dans le
message de news: eE$fi$
Bonjour à tous,
J'ai actuellement un progiciel qui utilise SQLSERVER , dans celui ci je peux
tarifer soit en requêtes SQL ou par l'intermédiaire d'un classeur Excel.

Je voudrais savoir s'il est possible de reproduire dans une requete SQL ceci
:
soit sous excel un tableau à double entrée avec en intersection la valeur
dont j'ai besoin

capital | Nature|Resultat
2000 | 2 |642
Capital/nature |1 |2 |3
0 |500 |602 |705
1000 |550 |622 |765
2000 |600 |642 |825
3000 |650 |662 |885
4000 |700 |682 |945


La formule sous resultat est =RECHERCHEV(A2;A3:D8;EQUIV(B2;A3:D3;0);1)
capital est en A1.
945 en D8.

La recherche dans la colonne A se fait en valeur approchée et je cherche
l'intersection avec la ligne 3 en valeur exacte.

Bien sûr mon tableau réél est bien plus grand.
Merci d'avance pour vos idées.
Oliv'





Avatar
Oliv'
Bonjour Fred et Merci pour cette solution.
Il semble clair que cette solution sera moins couteuse que les "CASE"
cependant je souhaitais trouver une solution sans créer de table permanente.
Et créer des tables temporaires n'est peut être plus aussi rentable !

Tu es un peu vexant en disant " La conclusion est simple : apprendre le
langage SQL !" ;-(
il y a une différence entre demander une idée de conception et le mode
d'emploi d'une clause quelconque,
Mais je confirme quand même : j'apprends tous les jours !! et c'est ce qui
me plait dans mon boulot.

Have a nice day and thank you
Oliv'




Fred BROUARD wrote:
Le mieux serait de créer des tables de tranche et de nature de la
sorte :

CREATE TABLE T_TRANCHE_CAPITAL_TRC
(TRC_ID INTEGER NOT NULL PRIMARY KEY,
TRC_MAX_CAPITAL DECIMAL(16,2) NOT NULL)

INSERT INTO T_TRANCHE_CAPITAL_TRC VALUES (1, 0)
INSERT INTO T_TRANCHE_CAPITAL_TRC VALUES (2, 1000)
INSERT INTO T_TRANCHE_CAPITAL_TRC VALUES (3, 2000)
INSERT INTO T_TRANCHE_CAPITAL_TRC VALUES (4, 3000)
INSERT INTO T_TRANCHE_CAPITAL_TRC VALUES (5, 4000)

CREATE TABLE T_NATURE_NTR
(NTR_ID INTEGER NOT NULL PRIMARY KEY,
NTR_VAL INTEGER NOT NULL)

INSERT INTO T_NATURE_NTR VALUES (1, 1)
INSERT INTO T_NATURE_NTR VALUES (2, 2)
INSERT INTO T_NATURE_NTR VALUES (3, 3)

CREATE TABLE TJ_CAPITAL_NATURE_CPN
(TRC_ID INTEGER NOT NULL FOREIGN KEY REFERENCES CAPITAL_TRC (TRC_ID
), NTR_ID INTEGER NOT NULL FOREIGN KEY REFERENCES T_NATURE_NTR
(NTR_ID), CPN_VAL INTEGER NOT NULL,
CONSTRAINT PK_CPN PRIMARY KEY (TRC_ID,NTR_ID))

INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (1, 1, 500)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (1, 2, 602)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (1, 3, 705)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (2, 1, 550)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (2, 2, 622)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (2, 3, 765)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (3, 1, 600)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (3, 2, 642)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (3, 3, 825)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (4, 1, 650)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (4, 2, 662)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (4, 3, 885)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (5, 1, 700)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (5, 2, 682)
INSERT INTO TJ_CAPITAL_NATURE_CPN VALUES (5, 3, 945)

Dès lors une simple requête SQL suffit :

SELECT CPN_VAL
FROM T_TRANCHE_CAPITAL_TRC TRC
INNER JOIN TJ_CAPITAL_NATURE_CPN CPN
ON TRC.TRC_ID = CPN.TRC_ID
INNER JOIN T_NATURE_NTR NTR
ON CPN.NTR_ID = NTR.NTR_ID
WHERE TRC_MAX_CAPITAL = (SELECT MAX(TRC_MAX_CAPITAL)
FROM T_TRANCHE_CAPITAL_TRC
WHERE TRC_MAX_CAPITAL<1350
AND NTR_VAL = 3


La conclusion est simple : apprendre le langage SQL !

Mon site comme mon bouquin peuvent t'y aider...

A +


Oliv' a écrit:
Bonjour à tous,
Histoire de faire avancer le schmillblick je me répond ;-)
Est ce que la seule solution pour reproduire cela en SQL serait :


declare @capital decimal, @nature int

set @capital = 1350
set @nature = 3

Select resultat = case when @capital >@00 then

case @nature when 3 then 945
when 2 then 682
when 1 then 700 end
when @capital >= 3000 then
case @nature when 3 then 885
when 2 then 662
when 1 then 650 end

when @capital >= 2000 then
case @nature when 3 then 825
when 2 then 642
when 1 then 600 end
when @capital >= 1000 then
case @nature when 3 then 765
when 2 then 622
when 1 then 550 end
when @capital >= 0 then
case @nature when 3 then 705
when 2 then 602
when 1 then 500 end
end

MErci d'avance pour votre avis
Oliv'


"Oliv'" <(supprimerceci) a écrit dans le
message de news: eE$fi$
Bonjour à tous,
J'ai actuellement un progiciel qui utilise SQLSERVER , dans celui ci
je peux tarifer soit en requêtes SQL ou par l'intermédiaire d'un
classeur Excel.

Je voudrais savoir s'il est possible de reproduire dans une requete
SQL ceci



soit sous excel un tableau à double entrée avec en intersection la
valeur dont j'ai besoin

capital | Nature|Resultat
2000 | 2 |642
Capital/nature |1 |2 |3
0 |500 |602 |705
1000 |550 |622 |765
2000 |600 |642 |825
3000 |650 |662 |885
4000 |700 |682 |945


La formule sous resultat est
=RECHERCHEV(A2;A3:D8;EQUIV(B2;A3:D3;0);1) capital est en A1.
945 en D8.

La recherche dans la colonne A se fait en valeur approchée et je
cherche l'intersection avec la ligne 3 en valeur exacte.

Bien sûr mon tableau réél est bien plus grand.
Merci d'avance pour vos idées.
Oliv'