2010-09-15 6 views
2

Voici la questionTSQL Théorie des ensembles

Vous devez étiqueter les dés avec des nombres. Chaque dé a 6 côtés. Vous avez deux dés. Vous devez étiqueter de sorte que vous pouvez afficher (somme non ou d'un produit), les chiffres de 0 à 31. Sortie complète:

00 
01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 

J'ai essayé

(select 
     0 as dice1 union 
     select 1 union 
     select 2 union 
     select 3 union 
     select 4 union 
     select 5) 

    join 

(select 
     0 as dice2 union 
     select 1 union 
     select 2 union 
     select 3 union 
     select 4 union 
     select 5) 

Je ne sais pas comment traiter davantage. L'aide est appréciée.

+4

Ne sait pas. Vous aurez certainement besoin de 6,7,8,9 sur l'un ou l'autre des dés. Mais 0,1 et 2 doivent être sur les deux dés qui ne laisse que 6 emplacements pour 7 numéros! Peut-être que vous devez retourner le 6 à l'envers pour obtenir 9. Pas beaucoup à faire avec SQL Server 2005 de toute façon! –

+1

Problème classique avec la réalisation de "calandres continus" faits de blocs de bois que l'on voit parfois dans les banques. Le problème est strictement sur-contraint et est résolu avec une ambiguïté 6/9 tout comme suggère @Martin. Mais non, de toute façon un problème de programmation et hors sujet ici. – dmckee

Répondre

1

Comme Martin a mentionné dans son commentaire, la clé pour résoudre ce problème est d'utiliser la tête en bas 6 pour un 9. Voir: solution: calendar cubes

En ce qui concerne une solution T-SQL programmatique, peut-être:

declare @Dice1 table (
    side int 
) 

insert into @Dice1 
    (side) 
    select 0 union all 
    select 1 union all 
    select 2 union all 
    select 3 union all 
    select 4 union all 
    select 5 

declare @Dice2 table (
    side int 
) 

insert into @Dice2 
    (side) 
    select 0 union all 
    select 1 union all 
    select 2 union all 
    select 6 union all 
    select 7 union all 
    select 8 union all 
    select 9 /* Upside down 6 */ 


select CAST(d1.side as CHAR(1)) + CAST(d2.side as CHAR(1)) as MyDate 
    from @Dice1 d1 
     cross join @Dice2 d2 
    where d1.side * 10 + d2.side <= 31 
union 
select CAST(d2.side as CHAR(1)) + CAST(d1.side as CHAR(1)) as MyDate 
    from @Dice1 d1 
     cross join @Dice2 d2 
    where d2.side * 10 + d1.side <= 31 
order by MyDate 
+0

Solution très élégante. C'est «0 1 2 3 4 5» et «0 1 2 7 8 6». –

+0

Pourquoi 'MyDate'? :) –

+0

@Denis: Années et années de consommation d'alcool Microsoft Kool-Aid: Mes documents, mes téléchargements, ..., MyDate. :-) –

Questions connexes