-1
votes

SQL Insérer dans avec Sélectionner une instruction

J'ai besoin d'insérer la colonne pincement, nom, département, statutin, statut de code> à partir du tableau DailyDatawh code> dans le tableau Rémydata ​​code> avec la condition et ceci est Ma requête:

INSERT INTO DAILYDATAWH (NIP, NAME, DEPARTMENT, STATUSIN, STATUSOUT) 
VALUES 
    ('A1', 'ARIA', 'BB', '1/21/2020 8:00:00 AM', '1/21/2020 8:06:22 AM'),
    ('A1', 'ARIA', 'BB', '1/21/2020  8:16:07 AM', '1/21/2020  9:51:21 AM'),
    ('A1', 'ARIA', 'BB', '1/21/2020 10:00:00 AM', '1/21/2020 10:06:22 AM'),
    ('A1', 'ARIA', 'BB', '1/21/2020  11:16:07 AM', '1/21/2020  12:51:21 AM'),
    ('A1', 'ARIA', 'BB', '1/22/2020 8:05:00 AM', '1/22/2020 8:15:22 AM'),
    ('A1', 'ARIA', 'BB', '1/22/2020  9:20:07 AM', '1/22/2020  10:00:21 AM');


13 commentaires

Montrez-nous quelques échantillons de données DailyDatawh et ce que vous voulez insérer dans l'autre table. exemple de reproductible minimal


Si vous n'utilisez pas «groupe par», vous ne pouvez pas utiliser les agrégations MIN et Max. D'autre part, sans utiliser "groupe par", min et max, vous insérerez des doublons dans la table (si la clé est effectuée par les 3 champs NIVEAU, NOM, DÉPARTEMENT), qui peut ou non être fausse.


S'il vous plaît vérifier ma question mise à jour @jarlh


Avec cette table des données, ce qui devrait être inséré dans SumexData?


@Dea ananda si vous donnez des données d'échantillons et une sortie attendue, elle sera


J'utilise des agrégations min et max car je veux juste sélectionner une date de date minimale dans la colonne Statusin et Maximum DateTime dans la colonne StatusOut @giovanniluisoto


@Deaananda n'utilise tout simplement pas groupe par et des fonctions agrégées si vous ne le souhaitez pas. Si vous souhaitez que les agrégats, vous avez besoin de groupe par ou la clause sur . Avec cette donnée de test cependant, vous vous retrouverez avec 6 lignes identiques


et j'utilise où condition parce que je veux juste sélectionner la même date lorsque Statut et STATUS OUT Dans la même ligne @giovanniluuisotto


Dans ce cas, vous avez un grave problème - les cordes de problèmes ne sont pas des dates. L'utilisation de manipulations de chaîne et de comparaison échoue d'une manière ou d'une autre. Utilisez des champs appropriés DateTime2 à la place et comparez les dates avec par exemple moulage (Statusin comme date) = Cast (StatusOut comme date) . L'optimiseur de SQL Server est suffisamment intelligente pour convertir cela en une requête de plage pouvant utiliser des index mais il ne sera pas en mesure de calculer les statistiques avec précision. Mieux encore, ajoutez date pour contenir les dates et comparer celles-ci. Vous pouvez utiliser une colonne calculée persistée pour cette


S'il vous plaît vérifier ma question mise à jour, il y a des données d'exemple et une sortie attendue @jonway


Pouvez-vous me montrer la requête pour résoudre ce problème? @Panagiotiskanavos


Obtenez votre instruction SELECT CORRECT PREMIER TEST avec un outil qui vous permettra de voir que seul un seul jeu d'enregistrements est renvoyé, alors une fois que cela est correct, déposez-le dans l'insert, entourez la requête entre parenthèses.


Si cela fonctionne, pourquoi avez-vous besoin de le changer?


3 Réponses :


0
votes

Pour obtenir le résultat souhaité, qui est le Min StatusIn et Max StatusOut de NIP, NOM, DÉPARTEMENT Le moyen le plus simple et le plus simple (pour moi) est d'utiliser le groupe par, il sera fait de toute façon même si vous utilisez une fonction de fenêtres.

--in your original query you use
{...} WHERE LEFT(STATUSIN,13) = {...}
-- which i.e. translates to
SELECT LEFT ('1/21/2020 8:00:00 AM',13)
which result is '1/21/2020 8:0', so it actually compares date, hour and part of the minutes
-- another example
SELECT LEFT ('1/21/2020 10:00:00 AM',13) 
results in '1/21/2020 10:', so this case compares only date and hour


1 commentaires

Merci de m'avoir aidé, mais j'utilise des agrégations min et max, car je veux simplement sélectionner une date de date minimale dans la colonne Statusin et Maximum DateTime dans la colonne StatusOut



2
votes

Vous pouvez utiliser la fonction de fenêtre:

INSERT INTO SUMMARYDATA(NIP, NAME, DEPARTMENT, STATUSIN, STATUSOUT)
     SELECT DISTINCT d.NIP, d.NAME, d.DEPARTMENT,
            MIN(d.STATUSIN) OVER (PARTITION BY d.NIP, d.NAME, d.DEPARTMENT, convert(date, d.STATUSIN)) as STATUSIN,
            MAX(d.STATUSOUT) OVER (PARTITION BY d.NIP, d.NAME, d.DEPARTMENT, convert(date, d.STATUSOUT)) as STATUSOUT
     FROM DAILYDATAWH d;


1 commentaires

Merci de m'aider, c'est du travail :) Mais comment insérer cette valeur dans le tableau samaydata ?



0
votes

Vous pouvez obtenir des fonctions de classement.

;WITH CTE_Status AS
(SELECT  NIP, NAME, DEPARTMENT, StatusIn, StatusOut ROW_NUMBER() OVER(PARTITION BY NIP, NAME, DEPARTMENT,CAST(StatusIn AS Date) ORDER BY d.STATUSIN) AS StatusIn_rnk, ROW_NUMBER() OVER(PARTITION BY NIP, NAME, DEPARTMENT, CAST(StatusIn AS Date) ORDER BY d.STATUSOUT DESC) AS StatusOut_rnk
FROM DAILYDATAWH d
)
SELECT a.NIP, a.Name, a.Department,a.StatusIn, b.StatusOut 
FROM CTE_Status AS a
JOIN CTE_Status AS b
ON a.StatusIn_rnk = b.StatusOut_rnk
WHERE a.StatusIn_rnk = 1;


0 commentaires