Je joue toujours avec les tables et les requêtes, mais j'ai besoin d'aide avec une requête SQL Server.
J'ai une table qui ressemble à ceci.
UPDATE working_table t1
SET Result = 'Failed'
WHERE disktype = 'OS' AND
status = 'Failed' AND
NOT EXISTS (SELECT 1 FROM working_table t2 WHERE t1.VMname = t2.VMname);
Dans les résultats , j'aimerais qu'il dise "Terminé" si le système d'exploitation et les disques de données ont l'état terminé.
Si toutefois, le disque du système d'exploitation affiche un échec, alors la colonne de résultats devrait afficher un échec pour tous les disques de cette VM.
Comme ça.
VMName | DiskType | Status | Result ---------+------------+-------------+--------- TestVM1 | OS | Completed | Completed TestVM1 | Data | Completed | Completed TestVM2 | OS | Failed | Failed TestVM2 | Data | Completed | Failed TestVM2 | Data | Completed | Failed
J'ai essayé de bricoler une requête, mais je ne sais pas quoi Je me trompe car il ne fait rien.
VMName | DiskType | Status | Result ---------+------------+-------------+--------- TestVM1 | OS | Completed | TestVM1 | Data | Completed | TestVM2 | OS | Failed | TestVM2 | Data | Completed | TestVM2 | Data | Completed |
3 Réponses :
Cette requête peut vous aider.
SELECT *,MAX(status)
OVER (
partition BY vmname
ORDER BY vmname ) [Results]
FROM working_table
vous pouvez mettre à jour votre tableau à partir de ces résultats
On dirait qu'il n'a besoin que d'un EXISTS
UPDATE t1
SET Result = CASE
WHEN EXISTS (SELECT 1 FROM working_table t2 WHERE t2.VMname = t1.VMname AND t2.disktype = 'OS' AND t2.[Status] = 'Failed')
THEN 'Failed'
ELSE t1.[Status]
END
FROM working_table t1;
Ou si vous souhaitez mettre à jour tous les résultats, pas seulement ceux qui ont échoué:
UPDATE t1
SET Result = 'Failed'
FROM working_table t1
WHERE EXISTS (
SELECT 1
FROM working_table t2
WHERE t2.VMname = t1.VMname
AND t2.disktype = 'OS'
AND t2.[Status]= 'Failed'
);
Veuillez essayer
create table working_table
(
VMName varchar(30),
DiskType varchar(64),
[Status] varchar(30),
Result varchar(64)
)
insert into working_table values
('TestVM1','OS','Completed',NULL),
('TestVM1','Data','Completed',NULL),
('TestVM2','OS','Failed',NULL),
('TestVM2','Data','Completed',NULL),
('TestVM2','Data','Completed',NULL)
;WITH CTE AS
(
SELECT
*,
SUM(CASE [Status] WHEN 'Failed' THEN 1 ELSE 0 END) OVER (partition by VMName) as v_flag
FROM working_table
)
UPDATE CTE SET Result=CASE WHEN v_flag >0 THEN 'Failed' ELSE 'Completed' END
--Query
SELECT * FROM working_table
--Output
/*
VMName DiskType Status Result
------------------------------ ---------------------------------------------------------------- ------------------------------ ----------------------------------------------------------------
TestVM1 OS Completed Completed
TestVM1 Data Completed Completed
TestVM2 OS Failed Failed
TestVM2 Data Completed Failed
TestVM2 Data Completed Failed
*/
Cordialement,
Will
Votre table n'a-t-elle que 2 valeurs de type de disque:
OSetData? Seulement 2 valeurs de statut:TerminéetÉchec? Que faire siDonnéesestÉchecetOSestTerminé?