|
|
|
Forum Newbie
      
Group: General Forum Members
Last Login: Thursday, November 01, 2012 8:02 PM
Points: 4,
Visits: 7
|
|
Hi All,
Let's say I have a table like the following:
row1 row2 row3 row4 0 6 0 0 0 0 30 0 4 0 0 0 0 0 0 18
but I want to return a resultset like:
row1 row2 row3 row4 4 6 30 18
Does anyone have any ideas as to how I would do that with T-SQL?
Thanks, C
|
|
|
|
|
SSC Veteran
      
Group: General Forum Members
Last Login: Thursday, May 30, 2013 1:26 PM
Points: 278,
Visits: 808
|
|
-- Test data:
declare @a as table ( row1 int, row2 int, row3 int, row4 int );
insert @a values (0,6,0,0); insert @a values (0,0,30,0); insert @a values (4,0,0,0); insert @a values (0,0,0,18);
--select * from @a;
-- Example solution:
select max(case when row1 <> 0 then row1 end) as Row1, max(case when row2 <> 0 then row2 end) as Row2, max(case when row3 <> 0 then row3 end) as Row3, max(case when row4 <> 0 then row4 end) as Row4 from @a
|
|
|
|
|
Forum Newbie
      
Group: General Forum Members
Last Login: Thursday, November 01, 2012 8:02 PM
Points: 4,
Visits: 7
|
|
Laurie,
Thanks so much. I think that is really gonna help me.
C ~
|
|
|
|
|
SSC Veteran
      
Group: General Forum Members
Last Login: Thursday, May 30, 2013 1:26 PM
Points: 278,
Visits: 808
|
|
|
|
|
|
Valued Member
      
Group: General Forum Members
Last Login: Thursday, November 08, 2012 9:15 AM
Points: 54,
Visits: 82
|
|
Here is my two cents. You don't need a Case Statement. Just simple One Line Query would work fine.
declare @MyTable as table ( Column1 int, Column2 int, Column3 int, column4 int );
insert @MyTable values (0,6,0,0); insert @MyTable values (0,0,30,0); insert @MyTable values (4,0,0,0); insert @MyTable values (0,0,0,18);
Select Col1 = Max(Column1), Col2 = Max(Column2), Col3 = Max(Column3), Col4 = Max(Column4) FROM @MyTable
|
|
|
|
|
Forum Newbie
      
Group: General Forum Members
Last Login: Thursday, November 01, 2012 8:02 PM
Points: 4,
Visits: 7
|
|
T,
Thanks for your reply.
C ~
|
|
|
|
|
SSC Veteran
      
Group: General Forum Members
Last Login: Thursday, March 07, 2013 11:07 AM
Points: 266,
Visits: 159
|
|
clay.calvin,
The SUM() function is another option that may be applicable. Compare the MAX() function to the SUM() function (note I have changed the VALUES in the fourth insert to demonstrate the difference):
DECLARE @MyTable AS TABLE ( Column1 INT, Column2 INT, Column3 INT, column4 INT );
INSERT @MyTable VALUES (0,6,0,0); INSERT @MyTable VALUES (0,0,30,0); INSERT @MyTable VALUES (4,0,0,0); INSERT @MyTable VALUES (1,2,3,18);
SELECT Col1 = MAX(Column1), Col2 = MAX(Column2), Col3 = MAX(Column3), Col4 = MAX(Column4) FROM @MyTable
SELECT Col1 = SUM(Column1), Col2 = SUM(Column2), Col3 = SUM(Column3), Col4 = SUM(Column4) FROM @MyTable
output from first statement:
Col1 Col2 Col3 Col4 ----------- ----------- ----------- ----------- 4 6 30 18
output from second statement:
Col1 Col2 Col3 Col4 ----------- ----------- ----------- ----------- 5 8 33 18
The aggregate function you will choose depends on what you want to accomplish.
-gjr
|
|
|
|
|
SSCommitted
      
Group: General Forum Members
Last Login: Tuesday, January 15, 2013 11:11 AM
Points: 1,945,
Visits: 2,782
|
|
Please post DDL, so that people do not have to guess what the keys, constraints, Declarative Referential Integrity, data types, etc. in your schema are. If you know how, follow ISO-11179 data element naming conventions and formatting rules. Code should be in Standard SQL as much as possible and not local dialect. This is minimal polite behavior on SQL forums.
It would also help if you knew what normalization was because this looks like a repeating group mess.
You seem to have an integrity rule that there is one and only one non-zero value per row and per column. But you have no constraint to enforce; in fact, you have no data integrity at all. First let me kludge up the mess and add those constraints.
CREATE TABLE Foobar (row1 INTEGER DEFAULT 0 NOT NULL CHECK (row1 >= 0), row2 INTEGER DEFAULT 0 NOT NULL CHECK (row2 >= 0), row3 INTEGER DEFAULT 0 NOT NULL CHECK (row3 >= 0), row4 INTEGER DEFAULT 0 NOT NULL CHECK (row4 >= 0), PRIMARY KEY (row1, row2, row3, row4), CHECK (SIGN(row1) + SIGN(row2) + SIGN(row3) + SIGN(row4) = 1) );
INSERT INTO Foobar VALUES (0, 6, 0, 0), (0, 0, 30, 0), (4, 0, 0, 0), (0, 0, 0, 18);
Do you see why 80-95% of the work in SQL is in the DDL, not the DML? All that work makes this super simple DML possible:
SELECT MAX(row1), MAX(row2), MAX(row3), MAX(row4) FROM Foobar;
Now the right way to do a “fake array” with values on the main diagonal is:
CREATE TABLE Foobar (i INTEGER NOT NULL UNIQUE, j INTEGER NOT NULL UNIQUE, foo_value INTEGER NOT NULL CHECK (foo_value > 0));
Generate the non-diagonal zeroes in a VIEW or the query. Google up an old article of mine on arrays for more details.
Books in Celko Series for Morgan-Kaufmann Publishing Analytics and OLAP in SQL Data and Databases: Concepts in Practice Data, Measurements and Standards in SQL SQL for Smarties SQL Programming Style SQL Puzzles and Answers Thinking in Sets Trees and Hierarchies in SQL
|
|
|
|
|
Forum Newbie
      
Group: General Forum Members
Last Login: Thursday, November 01, 2012 8:02 PM
Points: 4,
Visits: 7
|
|
Thanks everyone,
Laurie's suggestion worked perfectly. I'm on to the next project. I did not mean to offend anyone or make things hard for people to help me. I'll remember the tip for the next post.
C ~
|
|
|
|