Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
Discussion Groups
DB Engine
SQL ServerMSDESQL Server CE
Services
Analysis (Data Mining)Analysis (OLAP)DTSIntegration ServicesNotification ServicesReporting Services
Programming
CLRConnectivitySQLXML
Other Technologies
ClusteringEnglish QueryFull-Text SearchReplicationService Broker
General
Data WarehousingPerformanceSecuritySetupSQL Server ToolsOther SQL Server Topics
DirectoryUser Groups
Related Topics
MS AccessOther DB ProductsMS Server Products.NET DevelopmentVB DevelopmentJava DevelopmentMore Topics ...

SQL Server Forum / General / Other SQL Server Topics / July 2005

Tip: Looking for answers? Try searching our database.

Interesting SELECT question

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
ms news group - 06 Jul 2005 12:50 GMT
Hello

Does ANSI SQL support conditional selects ?

I have a table with say 15 fields

tblTale1
ID
F1
F2
F3
F4
F5
F6
.
.
.
F15

What I want to do is, add all the Fields from F1 to F15 and divide that
total by the total number of fields which were more than 0.

I know how to sum you can use Sum(f1+f2+f3....) , but how can I get the
number of fields which is more than 0 ?

Even if I put 15 conditions, if f1 > 0 or f2 > 0 or f3 > 0, it still doesn't
give me the # of feilds for that one record which is greater than zero...

I can't think of any solution except to put these fields in another table.

Let me know if i'm missing something.

Thanks
Uri Dimant - 06 Jul 2005 13:32 GMT
I don't understand you. Can you post DDL+ sample data + expected result?

Did you mean ROWS not FIELDS?

> Hello
>
[quoted text clipped - 29 lines]
>
> Thanks
David Portas - 06 Jul 2005 13:36 GMT
Your table design is very questionable but assuming no NULLs and no
negatives, try this:

SELECT
(f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8 + f9
 + f10 + f11 + f12 + f13 + f14 + f15)
/
(SIGN(f1) + SIGN(f2) + SIGN(f3) + SIGN(f4) + SIGN(f5)
+ SIGN(f6) + SIGN(f7) + SIGN(f8) + SIGN(f9) + SIGN(f10)
+ SIGN(f11) + SIGN(f12) + SIGN(f13) + SIGN(f14) + SIGN(f15))
FROM Table1 ;

If you have to cope with negatives then change SIGN(x) to ABS(SIGN(x)).

In general for  conditional execution take a look at the CASE
expression.

Signature

David Portas
SQL Server MVP
--

Brian Selzer - 06 Jul 2005 14:35 GMT
you could use case

select (f1 + f2 + f3 + f4) / case when f1 = 0 and f2 = 0 and f3 = 0 and f4 =
0 then 1 else case when f1 = 0 then 0 else 1 end + case when f2 = 0 then 0
else 1 end + case when f3 = 0 then 0 else 1 end + case when f4 = 0 then 0
else 1 end end from tableName

> Hello
>
[quoted text clipped - 29 lines]
>
> Thanks
Itzik Ben-Gan - 06 Jul 2005 15:04 GMT
Here are a couple of options:

select id,
 (f1*s1 + f2*s2 + f3*s3 + ... + f15*s15)
   / (s1 + s2 + s3 + ... + s15) as avgpos
from (select *,
       1+sign(sign(f1) -1) as s1,
       1+sign(sign(f2) -1) as s2,
       1+sign(sign(f3) -1) as s3,
       ...
       1+sign(sign(f15)-1) as s15
     from (select id,
             isnull(f1, 0) as f1,
             isnull(f2, 0) as f2,
             isnull(f3, 0) as f3,
             ...
             isnull(f15, 0) as f15
           from t1) as d1) as d2

select id, avg(val) as avgpos
from (select id, n,
       case n
         when 1 then f1
         when 2 then f2
         when 3 then f3
         ...
         when 15 then f15
       end as val
     from t1,
       (select 1 as n
        union all select 2
        union all select 3
        ...
        union all select 15) as nums) as d
where val > 0
group by id

Signature

BG, SQL Server MVP
www.SolidQualityLearning.com

> Hello
>
[quoted text clipped - 30 lines]
>
> Thanks
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2009 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.