-3
votes

SQL Obtenez toute la combinaison possible de chiffres

J'ai une table comme celle-ci xxx

peut créer une fonction qui retournera que xxx


5 commentaires

Votre exemple ne montre pas "toutes les combinaisons possibles". Par exemple, est 1 + 4 + 32 inclus ou non?


Essayez-vous d'obtenir un total de courant? Quelle dialecte SQL utilisez-vous? Les questions doivent inclure une balise pour la mise en œuvre de la SGBD (par exemple MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, etc.)


Je changerais votre titre car votre sortie souhaitée ne nécessite pas de «toutes les combinaisons possibles». "1" Par exemple, c'est dans toutes les combinaisons que vous avez besoin, "2" est dans toute la barre une. Pour "tous les possibles", ils ne seraient pas. par exemple. 4 + 32 est une combinaison possible, de même que 2 + 8, etc.


Qu'essayez-vous de faire avec cela? Je ne peux pas penser à un scénario où cela serait logique de produire / utiliser ces informations de cette manière.


Cela ressemble à une tentative de conversion d'entiers en binaire et à nouveau à nouveau (peut-être pour mettre en place un masque bitm). Il peut y avoir des fonctions intégrées à tous les RDBM que vous utilisez pour aider à cela sans entrer dans des UDF ou des pivots compliqués. S'il vous plaît expliquer plus sur ce que vous faites ici (ou pourquoi) et quels SGBDM utilisez-vous.


3 Réponses :


0
votes

est le nombre de colonnes retournées dynamiques? Si oui, alors je ne pense pas que cela puisse être fait via une fonction SQL.

Si vous recherchez simplement la dernière colonne - "somme", vous pouvez utiliser le code ci-dessous.

Sélectionner la puissance (2, Rowid) -1

Rowid est le numéro de ligne séquentielle.


0 commentaires

1
votes

Une demande intéressante, voici une solution pour MSSQL. Nous pouvons fournir de meilleures solutions si vous expliquez plus clairement votre objectif principal.

create table #temp (num int)
insert into #temp (num) values (1),(2),(4),(8),(16),(32)

select num, rn = ROW_NUMBER() OVER (order by num asc)
into #temp2
from #temp

select num,num2=null,num3=null,num4=null,num5=null,num6=null,Total=(select sum(num) from #temp2 where rn in (1)) from #temp2 where rn = 1
union
select null,num,null,null,null,null,Total=(select sum(num) from #temp2 where rn in (1,2)) from #temp2 where rn = 2
union
select null,null,num,null,null,null,Total=(select sum(num) from #temp2 where rn in (1,2,3)) from #temp2 where rn = 3
union
select null,null,null,num,null,null,Total=(select sum(num) from #temp2 where rn in (1,2,3,4)) from #temp2 where rn = 4
union
select null,null,null,null,num,null,Total=(select sum(num) from #temp2 where rn in (1,2,3,4,5)) from #temp2 where rn = 5
union
select null,null,null,null,null,num,Total=(select sum(num) from #temp2 where rn in (1,2,3,4,5,6)) from #temp2 where rn = 6
order by Total asc


2 commentaires

Cela ne produit pas les résultats que l'utilisateur voulait


Pas exactement la même chose, oui, mais produit la logique. Je pense que son but est différent en réel, c'est pourquoi il n'est pas clairement expliqué ici. Je pensais que cette requête l'aidera à structer sa propre requête. @Unhandledexcepsan



-1
votes

Voici comment je voudrais aborder le problème. J'ai pensé que vous pensiez utiliser un opérateur d'application, mais l'approche syndicale est la plus facile à travailler. La principale différence entre ma réponse et ma réponse (Kudos J'ai vraiment aimé l'approche) est que j'utilise des sous-requêtes non corrélées dans la ligne de génération des valeurs de somme et de maintenir le nombre unique de chacune des colonnes.

Je dirais que cela pourrait être atteint à l'aide de SQL dynamique pour un nombre inconnu de colonnes, mais je n'ai pas le temps ni la ressource pour essayer de travailler cela maintenant. Veuillez consulter ci-dessous le code, j'espère que cela aide. P>

declare @numbers table
(
    numberid int
);

insert into @numbers (numberid)
values
(1),
(2),
(4),
(6),
(8),
(16),
(32);


select numberid as [1], null as [2], null as [3], null as [4], null as [5], null as 
[6], (select sum(numberid) from @numbers where numberid=1) as [sum] from @numbers 
where numberid =1
union
select (select numberid from @numbers where numberid=1), numberid, null, null, null, 
null, (select sum(numberid) from @numbers where numberid in (1, 2)) from @numbers 
where numberid =2
union
select (select numberid from @numbers where numberid=1), (select numberid from 
@numbers where numberid=2), numberid, null, null, null, (select sum(numberid) from 
@numbers where numberid in (1, 2, 4)) from @numbers where numberid =4
union
select (select numberid from @numbers where numberid=1), (select numberid from 
@numbers where numberid=2), (select numberid from @numbers where numberid=4), 
numberid, null, null, (select sum(numberid) from @numbers where numberid in (1, 2, 4, 
8)) from @numbers where numberid =8
union
select (select numberid from @numbers where numberid=1), (select numberid from 
@numbers where numberid=2), (select numberid from @numbers where numberid=4), (select 
numberid from @numbers where numberid=8), numberid, null, (select sum(numberid) from 
@numbers where numberid in (1, 2, 4, 8, 16)) from @numbers where numberid =16
union
select (select numberid from @numbers where numberid=1), (select numberid from 
@numbers where numberid=2), (select numberid from @numbers where numberid=4), (select 
numberid from @numbers where numberid=8), (select numberid from @numbers where 
numberid=16), numberid, (select sum(numberid) from @numbers where numberid in (1, 2, 
4, 8, 16, 32)) from @numbers where numberid =32;


0 commentaires