2009-12-08 6 views
0

Tout d'abord, ma table mise en page:Comment puis-je créer une vue où les noms de colonnes sont définies à partir des valeurs de retour de requête

tblEquippedItems: < - (nom de la table)
de slotid (FK), itemid (FK), charid (FK) < - (attributs)

J'ai donc cette table qui décrit les objets qu'un personnage a équipés. L'ID de l'emplacement fait référence à l'emplacement de l'élément où réside l'élément, indiqué par itemid. Charid décrit le personnage qui a ces objets équipés.

Ce que je voudrais faire est de présenter les données dans un format comme ceci:

Nom du personnage | Elément d'épaule | Tête | Elément de jambe | ... | < - Noms des colonnes


Zalbar | Epaules de pénitence | Heaume de pénitence | Jambières de pénitence | ... | < - Valeurs de données

^- C'était ma tentative faible pour représenter un jeu de résultats de requête.

Je voudrais représenter cela comme une vue, donc je n'ai pas besoin d'avoir une table inutile et instable dans la base de données. Les noms de colonnes devront provenir de l'interrogation de la table de recherche qui stocke les noms d'emplacements d'éléments. Existe-t-il un moyen de définir par programme une telle vue? SQL dynamique peut-être? J'aimerais éviter que ...

+0

Dans quelle base de données (incl. La version) est-ce? –

Répondre

2
SELECT 
    [character].name     AS [character_name], 
    ISNULL([shoulder].name,'Nothing') AS [shoulder_item_name], 
    ISNULL([head].name,'Nothing')  AS [head_item_name], 
    etc... 
FROM 
    [character] 
LEFT JOIN 
    [tblEquippedItems] AS [shoulder_item] 
     ON [shoulder_item].charid = [character].id 
     AND [shoulder_item].slotid = 1 
LEFT JOIN 
    [item]    AS [shoulder] 
     ON [shoulder].id = [shoulder_item].itemid 
LEFT JOIN 
    [tblEquippedItems] AS [head_item] 
     ON [head_item].charid = [character].id 
     AND [head_item].slotid = 2 
LEFT JOIN 
    [item]    AS [head] 
     ON [head].id = [head_item].itemid 

etc... 
+0

+1 mais n'oubliez pas de réellement alias les colonnes, alias 'comme Shoulder Item' – Andomar

+0

doh ouais, notez à moi-même: dormir plus, répondre aux questions aléatoires sur SO moins ... – MatBailie

+0

Le sommeil est pour les faibles –

0

Qu'est-ce que vous cherchez dans SQL Server 2005/2008 est un pivot/Cross Tab. Vous ne pouvez pas définir une vue désactivée car les vues doivent être des colonnes prédéfinies. Vous pouvez le faire dans une procédure stockée cependant.

EDIT: Pour SQL Server 2000, regardez ce article about Cross Tabs. Bien que vous verriez principalement les onglets croisés/Pivots utiliser les agrégats Count() ou Sum(), vous pouvez tout aussi bien utiliser Max() et Min() sur les valeurs de texte.

+0

Est Pivot disponible dans SQL Server 2000? (C'est ce que je crois que je cours, je vais vérifier, c'est le serveur de mon école et je n'avais pas rencontré de problèmes de compatibilité de versions avant ... sauf quand je voulais des variables de table :() – RyanG

+0

'Pivot' était introduit dans SQL 2005. Avant cela, vous avez dû faire un peu de travail manuel pour créer le Pivot.Voyez un lien sur ma modification pour savoir comment l'accomplir –

0

Vous allez avoir un peu de flou sur la conception de la base de données ... une table objet-attribut-valeur comme celle-ci est considérée comme "mauvaise" pour une variété de raisons. Cela dit, je les utilise de temps en temps aussi quand les schémas de base de données doivent être stables mais la liste finale des attributs est en flux (et quand je peux vivre avec les conséquences de performance). Vous êtes au moins sur la bonne voie en utilisant VIEWs, ce qui vous permettra de rendre le schéma plus solide au fur et à mesure que la poussière se dépose. Les mauvaises nouvelles: bien que vous puissiez utiliser PIVOT pour vous faciliter la vie du côté SQL, la requête elle-même devra être programmée avec les noms de colonnes que vous voulez.

Il y a trois façons de le faire:

  1. modifier manuellement les VIEWs lorsque vous ajoutez/supprimer des attributs (maux de tête)
  2. requêtes dynamiques (en désordre, plus lent, ne peut pas utiliser une vue, besoin d'un pROCÉDURE au lieu)
  3. créer une procédure stockée qui utilise SQL dynamique pour déposer/créer toutes les vues après avoir modifié les attributs (les plus complexes)
+0

Heureusement, cette table n'est utilisée que pour les rapports, donc je Je ne me soucie pas vraiment de la bonne conception et de l'intégrité des données, car tout est garanti dans mes autres tableaux, simplement pour montrer un rapport de données déjà réputé cohérent. :) – RyanG

0

Beaucoup d'auto pour des jointures je pense

SELECT t1.charid,t1.itemid as shoulders,t2.itemid as helm,t3.itemid as legs 
FROM (SELECT charid,itemid from tblEquippedItems where slotid = 1) t1 //slotid = shuolders 
INNER JOIN (SELECT itemid from tblEquippedItems where slotid = 2) t2 //slotid = Helm 
ON t1.charid = t2.charid 
INNER JOIN (SELECT itemid from tblEquippedItems where slotid = 3) t3 //slotid = Legs 
ON t3.charid = t2.charid 

Autre que cela, vous pouvez essayer un pivot

+0

J'aime cette idée. J'ai oublié mes bases pour une seconde ... (eh bien, tout ce que je fais est relativement basique car je ne suis qu'un étudiant.) Comme je l'ai dit dans d'autres commentaires, cette table n'a pas besoin d'être vraiment optimisée ne sera qu'un utilisateur.) et les données qui le sous-tendent sont déjà solides et cohérentes. – RyanG

0

Quand je dois faire contre-pattes ou pivots, je les fais généralement en dehors de la base de données.

J'utilise MS Excel, avec une requête qui extrait les données dont j'ai besoin, sous forme de tableau. Je pivote ensuite dans MS Excel pour obtenir une vue croisée avec des "en-têtes de colonnes dynamiques".

Excel est loin d'être le seul choix. À l'extrémité supérieure, vous pouvez utiliser quelque chose comme des cubes de données Cognos.