2017-02-09 1 views
0

I ont une table comme ceci:valeurs d'insertion SQL d'une requête avec colonne calculée

id type | month | value 

Où type est AC, FC ou BG

Je veux créer pour chaque ID de ligne distincte, le type (où type est AC ou FC) une nouvelle ligne avec le type AF et la valeur AC s'il existe ou FC (AC la valeur est prioritaire sur la valeur FC).

Pour le moment, je peux extraire la liste unique sur laquelle, pour chaque article que je dois créer une nouvelle ligne:

select id_prj,month from table where type='AC' or type='FC' group by id_prj,month 

Comment puis-je créer pour chaque retour de cette requête une nouvelle ligne avec la valeur peut prendre la valeur AC ou FC en fonction de son existence.

Ci-dessous un exemple de table

| ID_PRJ | TYPE | MONTH | VALUE | 
----------------------------- 
| 1 | AC | 1 | 1000 | 
----------------------------- 
| 1 | FC | 1 | 200 | 
----------------------------- 
| 3 | BG | 1 | 1000 | 
----------------------------- 
| 4 | FC | 2 | 100 | 

Le tableau ci-après l'insertion doit être:

| ID_PRJ | TYPE | MONTH | VALUE | 
----------------------------- 
| 1 | AC | 1 | 1000 | 
----------------------------- 
| 1 | FC | 1 | 200 | 
----------------------------- 
| 3 | BG | 1 | 1000 | 
----------------------------- 
| 4 | FC | 2 | 100 | 
----------------------------- 
| 1 | AF | 1 | 1000 | 
----------------------------- 
| 4 | AF | 2 | 100 | 
+0

Je ne suis pas sûr de ce que vous recherchez dans la sortie. Pouvez-vous ajouter un peu plus de détails? Un exemple de la production que vous obtenez maintenant vs ce que vous cherchez serait génial. –

+0

la sortie est id et mois et pour chaque identifiant et mois, je veux créer une nouvelle ligne avec l'ID, mois, type = 'AF', valeur = 'la valeur de la ligne où id =' ID 'où type est AC Existez-vous ou tapez-vous FC – Kerby82

+0

une nouvelle ligne ou colonne? et vous devez fournir un tableau de données et à quoi doivent ressembler les données, sous forme de tableau, par la suite. Voici une question récente où ils font cela ... http://stackoverflow.com/questions/42143148/t-sql-cross-joins – scsimon

Répondre

2

que diriez-vous:

insert into table (ID_PRJ, TYPE, Month, Value) 


select id_prj,type,month,value from (
select id_prj,'FC' as type, month,value , row_number() over (partition by id_prj order by type asc) rowid 
from table 
where type='AC' or type='FC' 
) as x where rowid = 1 
+0

ce n'est pas clair pour moi. Pouvez-vous expliquer la logique derrière? Je ne connais pas la partition et quel est le type – Kerby82

+0

Cette requête a un problème. Puisque pour le même id nous pouvons avoir 12 lignes pour le type AC et 12 pour le type FC, il créera juste une ligne pour chaque identifiant dû à la partion et le rowid 1. Je veux produire 12 lignes pas seulement une. – Kerby82

+0

Peut-être que je peux ajouter, mois à partitionner par afin de séparer les lignes pour l'ID et le mois. select id, type, mois, valeur de ( select id, 'AF' comme type, mois, valeur, row_number() over (partition par ID, mois par ordre asc) rowid from ppm.dbo.monthly_financials où type = 'AC' ou type = 'FC' ) en tant que x où rowid = 1 – Kerby82

1

Vous semblez être juste changer le type. Je pense que ça le fait.

insert into table (ID_PRJ, TYPE, Month, Value) 
Select ID_PRJ, 'AF' Type, Month, Value 
from table where Type in ('AC','FC') 
+0

dans le cas où il y a 2 lignes pour AC et FC cela produira deux lignes mais je veux juste une avec la valeur de type = AC et si n'existe pas avec type = AC je veux la valeur from type = FC – Kerby82

+0

Dans ce cas, Kostya a la bonne solution. Sa requête utilisant des numéros de partition chaque id_prj ne regarde que les enregistrements AC ou FC et les ordonne par type, c'est-à-dire AC avant FC, s'ils existent et ensuite il prend la valeur du premier pour créer votre enregistrement. – kubasnack

1

Une façon assez simple de le faire est d'utiliser une jointure complète à une table dérivée.

Créer et remplir le tableau d'échantillons (S'il vous plaît nous sauver cette étape dans vos futures questions):

DECLARE @T AS TABLE 
(
    ID_PRJ int, 
    TYPE char(2), 
    MONTH int, 
    VALUE int 
) 

INSERT INTO @T VALUES 
(1, 'AC', 1, 1000), 
(1, 'FC', 1, 200), 
(3, 'BG', 1, 1000), 
(4, 'FC', 2, 100) 

L'insert ... instruction select:

INSERT INTO @T (ID_PRJ, MONTH, TYPE, VALUE) 
SELECT ISNULL(t1.ID_PRJ, t0.ID_PRJ), 
     ISNULL(t1.MONTH, t0.MONTH), 
     'AF', 
     ISNULL(t1.VALUE, t0.VALUE) 
FROM @T t0 
FULL JOIN 
(
    SELECT ID_PRJ, MONTH, TYPE, VALUE 
    FROM @T 
    WHERE TYPE = 'AC' 
) t1 ON t0.ID_PRJ = t1.ID_PRJ 
    AND t0.MONTH = t1.MONTH 
WHERE t0.TYPE IS NULL OR t0.TYPE = 'FC' 

Vérifier insert:

SELECT ID_PRJ, MONTH, TYPE, VALUE 
FROM @T 

Résultats:

ID_PRJ MONTH TYPE VALUE 
1  1  AC  1000 
1  1  FC  200 
3  1  BG  1000 
4  2  FC  100 
1  1  AF  1000 
4  2  AF  100