J'essaie de construire une table de fait avec SQL Server. Il ressemble actuellement à ceci: 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
4 Réponses :
Essayez ceci résultat p>
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
Une approche possible consiste à scinder les textes dans [Variant Descr.] et [Variant Command] et mettez à jour la table avec instruction dynamique.
Bien qu'utiliser entrée: P> 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>. -----------------------------------------------------------------------------
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
J'aime ça très approche directe i> ... +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 _'. Code>
@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) code >. Merci.
@Stephan, vous pouvez modifier la déclaration de Zhorov dans un Sélectionner ... dans #TMPTBL code> à 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 CODE> 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 code> est une colonne code> varchar code>, donc j'ai besoin d'ajouter ' code> avant et après d.item code> d. - ... n '' "où article = '' + d.item + n '' '; ' code>. Voir la réponse mise à jour.
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 | +------+----------+----------+------------+
Quelle version SQL-Server que vous utilisez?
Vous pouvez essayer cette réponse Stackoverflow.com/a/56254171/10532500
Sont
/ taille code> et/ style code> les seules options? Pourrait-il y avoir un cas avec/ style / taille code> et / ou/ taille / style code> transportant trois valeurs à la fois? est le tri fixé ou vous attendez-vous à des valeurs telles que la taille / la couleur code> 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] code> pourxxx code> option?@Zhorov: Oui, les colonnes sont générées de manière dynamique pour chaque valeur excessive de [ordre variant] dans la table.