2017-09-27 5 views
1

J'ai examiné un certain nombre de threads de transposition SQL ici et tous traitent des données de restructuration et/ou des résumés de données. J'ai une situation assez commune qui ne correspond à aucune de ces circonstances. S'il vous plaît gardez à l'esprit que c'est dans MS Access, et en utilisant une table liée (donc, aucune mise à jour n'est permise et il n'y a pas de clé ou d'identifiant).SQL pour MS Access table liée pour transposer des lignes et des colonnes

J'ai la table liée. Il n'y a que deux longues rangées de données. Par exemple, il s'agit d'une liste d'unités commerciales (BU) uniques et de ventes annuelles correspondantes.

linked_table 


    F1  F2  F3  F4 F5 ... 
    ----------------------------- 
row1 BU11 BU123 BU223 BU2 BU432... 
row2 $2345 $0  $50.50 $234 $567.22 

J'ai besoin cet ensemble de données transposées en quelque sorte dans ce:

new_table or new_query 

BU  Sales 
--------------- 
BU11  $2345 
BU123 $0 
BU223 $50.50 
BU2  $234 
BU342 $567.22 
... 

Encore une fois, il n'y a que deux longues rangées de données dans une table d'accès lié. J'ai seulement trouvé une façon très fastidieuse et laide de faire à ce sujet, et je me demandais s'il y avait une meilleure façon de le faire.

ÉTAPE 1 J'ai séparé les deux lignes de données en 2 requêtes distinctes

headers_qry 
    F1  F2  F3  F4 F5... 
    ------------------------------ 
row1 BU11 BU123 BU223 BU2 BU432... 

data_qry 
    F1  F2  F3  F4 F5... 
    ------------------------------ 
row1 $2345 $0  $50.50 $234 $567.22... 

Je suis un Hardcoded « clé commune » factice dans les deux ensembles de données

headers_qry 
    F1  F2  F3  F4 F5...  KEY 
    ---------------------------------------------- 
row1 BU11 BU123 BU223 BU2 BU432... UNIQUE123 

data_qry 
    F1  F2  F3  F4 F5...  KEY 
    ----------------------------------------------- 
row1 $2345 $0  $50.50 $234 $567.22... UNIQUE123 

Ensuite, J'ai ajouté une jointure entre les deux requêtes sur cette clé commune et couplé manuellement des paires d'en-tête et de données via des centaines d'instructions UNION. Aie!!!!

SELECT 
headers.F1 AS BU_Number, 
data.F1 AS BU_Sales 
FROM header_data_join_qry UNION ALL 
SELECT 
headers.F2 AS BU_Number, 
data.F2 AS BU_Sales 
FROM header_data_join_qry UNION ALL 
SELECT 
... 
headers.F100 AS BU_Number, 
data.F100 AS BU_Sales 
FROM header_data_join_qry UNION ALL; 

Non seulement cela est fastidieux et laid, MS ACCESS ne peut pas gérer ces multiples UNION toutes les requêtes et une fois que je suis arrivé à environ 100, il a commencé à donner l'instruction SQL erreur trop complexe.

Existe-t-il un moyen de gérer cela mieux, compte tenu des limitations de la table source liée et de l'environnement MS ACCESS SQL? Merci beaucoup!

+0

Vous avez obtenu jusqu'à 100? Je pensais que 50 était la limite de lignes SELECT dans UNION. Seule l'alternative que je connais est l'écriture d'enregistrements VBA dans la table temporaire - la table est permanente, les données sont temporaires. – June7

+0

Jetez un oeil à la troisième réponse [ici] (https: // stackoverflow.com/questions/7255423/comment-simuler-unpivot-in-access-2010). Peut-être que cela vous aidera – cha

+0

Je suis arrivé à 100 en séparant en 2 sous-requêtes essentiellement. Après cela, je ferais l'union des deux aussi. Cela augmente la tolérance d'ACCÈS au-dessus du total de 50 ... –

Répondre

1

Vous pouvez essayer la chose suivante. A partir de la position de départ où vous avez séparé les deux lignes de données, aucune clé commune n'est nécessaire (puisqu'elles sont toutes les deux une ligne).

SELECT DLookUp("F" & Number, "headers_qry") AS BU, DLookUp("F" & Number, "data_qry") As Sales 
FROM (
SELECT DISTINCT Abs(Ones.ID Mod 10) + Abs(Tens.ID Mod 10) * 10 + Abs(Hundreds.ID Mod 10)*100 As Number 
FROM MSysObjects As Ones, MSysObjects As Tens, MSysObjects As Hundreds 
) As NumbersQuery 
WHERE Number BETWEEN 1 And 200 

Essentiellement, cette requête a 2 parties:

  1. Une sous-requête qui renvoie tout nombre compris entre 0 et 999 (technique adaptée de Gustav)
  2. Une requête externe qui renvoie le numéro de la colonne spécifiée de vos deux requêtes, et filtre la sous-requête.

Le BETWEEN 1 And 200 peut être adapté à votre échantillon

Si un plus grand nombre sont nécessaires (0 à 9999) la sous-requête peut également être adapté

+0

Ceci est fyre. Merci! –

+0

@CamCall Si cela a répondu à votre question, veuillez marquer la réponse comme acceptée. Lisez [ici] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) pour savoir comment cela fonctionne et quels sont ses avantages. –

+0

Je dois dire qu'il a fallu 10 minutes de fonctionnement en état de non-réponse avant de renvoyer les enregistrements. –