-1
votes

Conversion des lignes en colonnes pour chaque identifiant distinct

Je veux convertir ceci xxx

dans ce xxx

mon objectif ultime est de concéder les trois valeurs de chaque trans_id (là-bas sont exactement trois pour chacun) dans une nouvelle valeur, sélectionnez-la et utilisez-la pour mettre à jour une autre table de transaction avec la valeur concaténée.


7 commentaires

Qu'avez-vous essayé? Où êtes-vous coincé coincé?


Nous avons besoin de plus d'informations, en particulier une troisième colonne, pour pouvoir générer les résultats souhaités.


trans_text n'est pas commandé. Comment vous assurez-vous que A, B, C tombera dans Trans_Text1, premier, deuxième, troisième tombera sous Trans_text2 ... Avez-vous une autre colonne pour assurer la commande de trans_text?


Donc, ce n'est pas un service de rédaction de code gratuit. Veuillez éditer la question pour inclure le SQL que vous avez essayé d'utiliser et nous vous aiderons à le réparer pour obtenir le résultat souhaité.


pivot L'opérateur est ce que vous êtes après.


Désolé, je ne suis pas une grande partie d'un mec SQL, je ne sais donc pas vraiment où commencer ou même comment faire correctement la question de Google. J'ai regardé quelques exemples de la fonction pivot, mais ils ne correspondaient pas vraiment à ce que je cherchais à faire. Il existe également une autre colonne qui identifie le "type". A, B et C ont tous de type 1, premier, deuxième, troisième tous ont de type 2, etc.


@JoOnningles. . . Les tables SQL représentent des ensembles non ordonnés . Les résultats souhaités suggèrent une commande - sans colonne spécifiant la commande, votre question ne peut pas être répondue dans SQL.


3 Réponses :


2
votes

Vous pouvez gérer cela en utilisant le groupe par lui-même.

select trans_id,[1] as trans_text1, [2] as trans_text2, [3] as trans_text3 
FROM @table
PIVOT (max(trans_text) for trans_type in ([1],[2],[3])) as pvt


2 commentaires

Cela fonctionne à l'exception d'un attelage. Il y a plus de TRANS_TYPES dans la table, alors juste les trois, donc le résultat a beaucoup de lignes NULL. J'ai essayé de le mettre dans un CTE et à utiliser Select * de Selction_CTE où NON (Trans_Text1 est NULL) mais il fonctionne très lentement. Y a-t-il un moyen de modifier la requête elle-même?


@JoOnningles. . . La question inclut: "Trois valeurs pour chaque Tran_id (il y a exactement trois pour chacun)". Cela répond à votre question et vous devez accepter la réponse. Si vous avez une question différente, posez une question neuve avec des données d'échantillonnage appropriées, des résultats souhaités et des explications.



1
votes

Si vous voulez concaténate les valeurs, vous voudrez alors une seule colonne pour le résultat, pas trois. La logique serait: xxx

Notez que la commande de trans_text est indéterminée. Vous pouvez ajouter un au sein du groupe (commande par) clause pour une commande stable.


0 commentaires

1
votes

Cliquez pour voir les tableaux

    select 
    ID as tran_id,
    REVERSE(PARSENAME(REPLACE(REVERSE([Text]), ',', '.'), 1)) AS tran_text1,
    REVERSE(PARSENAME(REPLACE(REVERSE([Text]), ',', '.'), 2)) AS tran_text12,
    REVERSE(PARSENAME(REPLACE(REVERSE([Text]), ',', '.'), 3)) AS tran_text3
    from 
    (
        SELECT DISTINCT ID,
        stuff
        (
            (
                SELECT ','+ [Text] FROM 
                (
    
                select tran_id ID,tran_text as [Text] from meta
    
                ) as tbl_one
    
                WHERE ID = t.ID 
                FOR XML PATH('')
            ),1,1,''
        ) as [Text]
    
        FROM 
    
        (SELECT DISTINCT ID,[Text] FROM 
    
            (
            select tran_id ID,tran_text as [Text] from meta
            ) as tbl_two
        ) t
    ) as tmptbl


0 commentaires