Select sql

lunedì 15 febbraio 2010 - 17.26

memmo77 Profilo | Expert

Ho due record nella mia tabella:

AFFCR DIGIT IMPORTO
-------------------- ------ ---------------------------------------
161884 2 50200.000000000000
161884 1 27502.000000000000

devo scrivere una select che in questo caso me li escluda, una sorta di:

where
digit = 2 and digit <> 1

Cioè prendere i record che si hanno digit=2 ma che non abbiamo anche un digit = 1

Come posso fare?
Grazie

alx_81 Profilo | Guru

>AFFCR DIGIT IMPORTO
>-------------------- ------ ---------------------------------------
>161884 2 50200.000000000000
>161884 1 27502.000000000000
>
>devo scrivere una select che in questo caso me li escluda, una
>sorta di:
>
>where
>digit = 2 and digit <> 1
>Cioè prendere i record che si hanno digit=2 ma che non abbiamo
>anche un digit = 1
>Come posso fare?
ehm.. where digit=2 solamente..

>Grazie
di nulla!

--

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

memmo77 Profilo | Expert

MMM no, non devo escludere l'affcr se è presente un record con digit = 1 e uno con digit = 2, ma escluderli entrambi. Devo prendere solo i record che abbiamo solo un record con digit = 2.

alx_81 Profilo | Guru

>MMM no, non devo escludere l'affcr se è presente un record con
>digit = 1 e uno con digit = 2, ma escluderli entrambi. Devo
>prendere solo i record che abbiamo solo un record con digit = 2.
Mi dispiace ma non capisco.
Puoi farmi un esempio con più dati?

--

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

memmo77 Profilo | Expert

AFFCR DIGIT IMPORTO
-------------------- ------ ---------------------------------------
161884 2 50200.000000000000
161884 1 27502.000000000000

in questo caso, non devo prendere nessun record

AFFCR DIGIT IMPORTO
-------------------- ------ ---------------------------------------
145895 2 50200.000000000000

in questo caso devo prendere il record

lbenaglia Profilo | Guru

>AFFCR DIGIT IMPORTO
>-------------------- ------ ---------------------------------------
>161884 2 50200.000000000000
>161884 1 27502.000000000000
>
>in questo caso, non devo prendere nessun record
>
>AFFCR DIGIT IMPORTO
>-------------------- ------ ---------------------------------------
>145895 2 50200.000000000000
>
>in questo caso devo prendere il record

Se ho capito bene il problema, una soluzione potrebbe essere:

USE tempdb; CREATE TABLE dbo.foo( AFFCR int NOT NULL, DIGIT tinyint NOT NULL, IMPORTO decimal(7, 2) NOT NULL ); INSERT dbo.foo VALUES (161884, 2, 50200.00) , (161884, 1, 27502.00) , (145895, 2, 50200.00); WITH CTE_GetKey AS ( SELECT AFFCR FROM dbo.foo WHERE DIGIT = 2 EXCEPT SELECT AFFCR FROM dbo.foo WHERE DIGIT < 2 GROUP BY AFFCR ) SELECT F.* FROM dbo.foo AS F JOIN CTE_GetKey AS CTE ON F.AFFCR = CTE.AFFCR; /* Output: AFFCR DIGIT IMPORTO ----------- ----- --------------------------------------- 145895 2 50200.00 (1 row(s) affected) */ DROP TABLE dbo.foo;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

alx_81 Profilo | Guru

>AFFCR DIGIT IMPORTO
>-------------------- ------ ---------------------------------------
>161884 2 50200.000000000000
>161884 1 27502.000000000000
>
>in questo caso, non devo prendere nessun record
>
>AFFCR DIGIT IMPORTO
>-------------------- ------ ---------------------------------------
>145895 2 50200.000000000000
>in questo caso devo prendere il record
Spero di aver capito:

USE tempdb; GO CREATE TABLE dbo.prova ( AFFCR int , DIGIT tinyint , IMPORTO decimal(24,12) ) GO INSERT INTO dbo.prova VALUES (161884, 2, 50200) INSERT INTO dbo.prova VALUES (161884, 1, 27502) INSERT INTO dbo.prova VALUES (145895, 2, 50200) INSERT INTO dbo.prova VALUES (161884, 3, 50200) INSERT INTO dbo.prova VALUES (161995, 1, 27502) INSERT INTO dbo.prova VALUES (161995, 2, 50200) INSERT INTO dbo.prova VALUES (111111, 2, 50700) GO SELECT * FROM dbo.prova ORDER BY AFFCR , DIGIT ;WITH CTE AS ( SELECT AFFCR , DIGIT , IMPORTO , rnum = ROW_NUMBER() OVER(PARTITION BY AFFCR ORDER BY AFFCR, DIGIT) FROM dbo.prova ) SELECT * FROM CTE WHERE rnum = 1 AND DIGIT = 2 DROP TABLE dbo.prova GO
--

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

memmo77 Profilo | Expert

Grazie mille a tutti. Ciao
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5