0
votes

Diviser une chaîne et insérer les pièces dans les bonnes colonnes à l'intérieur d'une table

J'essaie de construire une table de fait avec SQL Server. Il ressemble actuellement à ceci: xxx pré>

J'ai besoin de diviser la chaîne dans [Variant Descr.] Et insérez les pièces dans la colonne DIM_ correcte afin que la table puisse ressembler à ceci: p >

[Item]  [Variant Descr.] [Variant Order] [Dim_Colour] [Dim_Size] [Dim_Style]
----------------------------------------------------------------------------
01         NAVY/44        COLOUR/SIZE     NAVY         44       NULL
02         BLACK/S4       COLOUR/STYLE    BLACK        NULL     S4


6 commentaires

Quelle version SQL-Server que vous utilisez?


Vous pouvez essayer cette réponse Stackoverflow.com/a/56254171/10532500


Sont / taille et / style les seules options? Pourrait-il y avoir un cas avec / style / taille et / ou / taille / style transportant trois valeurs à la fois? est le tri fixé ou vous attendez-vous à des valeurs telles que la taille / la couleur aussi?


Ce ne sont pas les seules options. Le Permet de maximiser à 16 options différentes. Tout élément peut transporter 0 à 16 valeurs. Le tri n'est pas fixé non plus. J'utilise SQL Server 2016


@Stephan Donc, vous avez une colonne différente pour chaque option différente - [dim_xxxx] pour xxx option?


@Zhorov: Oui, les colonnes sont générées de manière dynamique pour chaque valeur excessive de [ordre variant] dans la table.


4 Réponses :


0
votes

Essayez ceci xxx

résultat xxx


0 commentaires

0
votes

Vous pouvez obtenir la sortie requise par -

select [item] ,
      [variant descr],[variant order],
      left([variant descr],charindex('/', [variant descr]) - 1) AS [Dim_Colour],
      CASE WHEN [variant order] like '%/SIZE' THEN SUBSTRING([variant descr], CHARINDEX('/', [variant descr]) +1, 100)
       ELSE '' END  AS [Dim_Size],
      CASE WHEN [variant order] like '%/STYLE' THEN SUBSTRING([variant descr], CHARINDEX('/', [variant descr]) +1, 100)
       ELSE '' END  AS [Dim_Style]
    from your_table_name


0 commentaires

1
votes

Une approche possible consiste à scinder les textes dans [Variant Descr.] et [Variant Command] et mettez à jour la table avec instruction dynamique. Bien qu'utiliser string_split () code> est le premier choix de départ avec SQL Server 2016, cette fonction n'est pas une option dans ce cas, car l'ordre des substrings n'est pas garanti. Une solution de travail consiste à utiliser openjson () code> - les valeurs de colonnes sont transformées en un objet code> json valide code> ( 'marine / 44' code> est traduit en '["NAVY", "44"]' code> par exemple) et des substrings sont récupérés à l'aide de openjson () code>.

entrée: P>

-----------------------------------------------------------------------------
Item    Variant Descr.  Variant Order     Dim_Colour    Dim_Size    Dim_Style
-----------------------------------------------------------------------------
01      NAVY/44         COLOUR/SIZE       NAVY          44  
02      BLACK/S4        COLOUR/STYLE      BLACK                     S4
03      NAVY/44/S4      COLOUR/SIZE/STYLE NAVY          44          S4
04      GREEN           COLOUR            GREEN     


6 commentaires

J'aime ça très approche directe ... +1 de mon côté


Merci! Cela a l'air génial! Votre exemple de code fonctionne bien. Cependant, dans mon environnement de test, j'obtiens une erreur: message 207, nom de colonne non valide 'DIM _'.


@Stephan a probablement de mauvaises données (selon le format de votre question). Je suis capable de reproduire cette erreur avec l'instruction suivante: Insert dans #Data (..) Valeurs ("04 ',' rouge / 44 ',' / taille ', null, null, null) . Merci.


@Stephan, vous pouvez modifier la déclaration de Zhorov dans un Sélectionner ... dans #TMPTBL à la place. Vous pouvez procéder à ce #TMPTBL comme une table d'intermédiaire et effectuez les mises à jour de là. Une approche générique comme dans ma réponse sera plus tolérante avec des valeurs inattendues ...


Vous avez raison - si je filtrais la ligne sans [la description de la variante], l'erreur diappears. Cela fonctionne bien pour les lignes où [article] est un entier. Je reçois toujours Échec de l'échec lorsque vous convertissez la valeur NVARCHAR '1972-S' vers Type de données INT Pour les articles contenant des caractères tels que '1972-S' Merci une tonne pour votre aide jusqu'à présent


@Stephan Désolé, élément est une colonne varchar , donc j'ai besoin d'ajouter ' avant et après d.item d. - ... n '' "où article = '' + d.item + n '' '; '. Voir la réponse mise à jour.



0
votes

Et voici une approche entièrement générique pour scinder cela (THX ZHOROV pour le MCVE!)

+------+----------+----------+------------+
| Item | Position | OrderKey | DescrValue |
+------+----------+----------+------------+
| 02   | 1        | COLOUR   | BLACK      |
+------+----------+----------+------------+
| 02   | 2        | STYLE    | S4         |
+------+----------+----------+------------+
| 04   | 1        | COLOUR   | GREEN      |
+------+----------+----------+------------+
| 04   | 2        | aNewOne  | 1          |
+------+----------+----------+------------+
| 04   | 3        | SIZE     | 2          |
+------+----------+----------+------------+
| 04   | 4        | EvenMore | 3          |
+------+----------+----------+------------+
| 04   | 5        | STYLE    | 4          |
+------+----------+----------+------------+
| 01   | 1        | COLOUR   | NAVY       |
+------+----------+----------+------------+
| 01   | 2        | SIZE     | 44         |
+------+----------+----------+------------+
| 03   | 1        | COLOUR   | NAVY       |
+------+----------+----------+------------+
| 03   | 2        | SIZE     | 44         |
+------+----------+----------+------------+
| 03   | 3        | STYLE    | S4         |
+------+----------+----------+------------+


0 commentaires