Essayer de le faire avec colonne par colonne est l'OMI une erreur; il suffit de faire en deux colonnes et choisir la colonne à l'appelant:
SELECT DISTINCT 'WS' AS [Col], WORKSTATION AS [Value] FROM VISIT
UNION ALL
SELECT DISTINCT 'CA' AS [Col], CATEGORY AS [Value] FROM VISIT
UNION ALL
SELECT DISTINCT 'BU' AS [Col], BUTTON AS [Value] FROM VISIT
qui est plus ou moins identique à:
SELECT 'WS' AS [Col], WORKSTATION AS [Value] FROM VISIT
UNION
SELECT 'CA' AS [Col], CATEGORY AS [Value] FROM VISIT
UNION
SELECT 'BU' AS [Col], BUTTON AS [Value] FROM VISIT
C'est alors un aller-retour, etc. Je d probablement utiliser un entier (peut-être même tinyint
) pour la première colonne (avec le client devrait savoir que 1 correspond à WORKSTATION etc) plutôt qu'un varchar, mais ce qui précède est donné uniquement pour la saveur.
Modifier les commentaires; ce qui suit prend en compte:
- y compris les différents types de données de l'union (conversion à un type commun)
- utilisant sortes ordinales sur les données d'origine, de sorte entiers sont encore classés 1,2,10 (entier tri), non 1,10,2 (string tri)
TSQL:
DECLARE @VISIT TABLE (WORKSTATION int, CATEGORY varchar(10), BUTTON int)
INSERT @VISIT VALUES (1,'1',1)
INSERT @VISIT VALUES (1,'2',3)
INSERT @VISIT VALUES (2,'1',2)
INSERT @VISIT VALUES (10,'1',1)
INSERT @VISIT VALUES (10,'3',1)
INSERT @VISIT VALUES (10,'1',2)
SELECT x.Col, x.Value
FROM (
SELECT CAST(1 as tinyint) AS [Col], ROW_NUMBER() over(order by WORKSTATION)
AS [Sort], CONVERT(varchar(20), WORKSTATION) AS [Value] FROM @VISIT
UNION
SELECT CAST(2 as tinyint) AS [Col], ROW_NUMBER() over(order by CATEGORY)
AS [Sort], CATEGORY AS [Value] FROM @VISIT
UNION
SELECT CAST(3 as tinyint) AS [Col], ROW_NUMBER() over (order by BUTTON)
AS [Sort], CONVERT(varchar(20), BUTTON) AS [Value] FROM @VISIT
) x ORDER BY x.Col, x.Sort
Pourquoi devrait-3 apparaître dans WOSKSTATION? –
Avez-vous mesuré la performance actuelle? Est-ce vraiment quelque chose que vous avez vraiment besoin d'améliorer? –
sry, mai b blanc ??? – william