Requête SQL Server pour regrouper par nom

J'ai datatables suivantes de 2 tables Notes (à gauche) et scans (à droite):

entrez la description de l'image ici

Imaginez le cueilleur et les emballeurs étaient tous différents, comme vous pouvez avoir JOHN, JANE etc.

J'ai besoin d'une requête qui sort comme ça:

Sur une date range donnée:

 Name - Picked (units) - Packed (units) MASI - 15 - 21 JOHN - 21 - 32 

etc.

Je ne peux pas comprendre comment même commencer cela, tous les conseils seront utiles merci.

Sans un "travailleur", prenez cette list de chaque Picker / Packer individuellement, je pense que vous auriez besoin de quelque chose comme ça …

 SELECT CASE WHEN action.name = 'Picker' THEN scans.Picker ELSE scans.Packer END AS worker, SUM(CASE WHEN action.name = 'Picker' THEN notes.Units ELSE 0 END) AS PickedUnits, SUM(CASE WHEN action.name = 'Packer' THEN notes.Units ELSE 0 END) AS PackedUnits FROM notes INNER JOIN scans ON scans.PickNote = notes.Number CROSS JOIN ( SELECT 'Picker' AS name UNION ALL SELECT 'Packer' AS name ) AS action GROUP BY CASE WHEN action.name = 'Picker' THEN scans.Picker ELSE scans.Packer END 

(Il s'agit en fait d'un ré-arrangement algébrique de la réponse que RaphaëlAlthaus a posté en même time que moi.) Les deux utilisent UNION pour calculer séparément les valeurs scans.Picker et scans.Picker vous avez des index séparés sur scans.Picker et scans.Packer alors je m'attendrais à ce que le mien soit le plus scans.Packer vous n'avez pas ces deux index alors je m'attendrais à ce que le mien soit le plus rapide.Je recommand de créer les index et les tests sur un set de données realtisic.)

MODIFIER

En fait, ce que je reorderais, c'est une modification de la table des scans complètement; le normaliser.

  • Votre set dés-normalisé a une ligne par PickNote, avec picker champs et packer .
  • Un set normalisé aurait deux lignes par PickNote avec les champs role et worker .

  id | PickNote | Role | Worker ------+----------+------+-------- 01 | PK162675 | Pick | MASI 02 | PK162675 | Pack | MASI 03 | PK162676 | Pick | FRED 04 | PK162676 | Pack | JOHN 

Cela vous permet de créer des index simples et des requêtes simples.

Vous pouvez d'abord vous brouiller avec les lignes supplémentaires inutiles , mais cela vous permettra d'get des requêtes plus simples, des requêtes plus rapides, une meilleure facilité de maintenance, une flexibilité accrue, etc.

En bref, cette normalisation peut coûter un peu plus d'espace, mais elle rapporte des dividendes pour toujours.

 SELECT name, SUM(nbPicked) Picked, SUM(nbPacked) Packed FROM (SELECT n.Picker name, SUM(n.Units) nbPicked, 0 nbPacked FROM Notes n INNER JOIN scans s ON s.PickNote = n.Number --WHERE s.ProcessedOn BETWEEN x and y GROUP BY n.Picker UNION ALL SELECT n.Packer name, 0 nbPicked, SUM(n.Units) nbPacked FROM Notes n INNER JOIN scans s ON s.PickNote= n.Number --WHERE s.ProcessedOn BETWEEN x and y GROUP BY n.Packer) GROUP BY name;