Solved

MS SQL 2012 ORDER BY Not Working

Posted on 2013-11-18
35
330 Views
Last Modified: 2013-11-20
Hi

I'm clearly doing something wrong here, but have no idea what it is.  I have the following code, which should copy all the columns into a new table (RemAds), converting a date and then ordering the new table by that date:

SET DATEFORMAT dmy
SELECT *
INTO T_1213_RemAds
FROM (
        SELECT *, convert(smalldatetime,Rem_Date, 103) as Rem_Date_Date
        FROM [dbo].['1213 Remittance Advices$']
        WHERE ISDATE(Rem_Date) = 1
     ) as Rem_Date_Date
ORDER BY Rem_Date_Date ASC;

Everything works except the ORDER BY bit.  If I export the file into Excel, the dates are coming out as yyyy-mm-dd hh:mm:ss (I'm guessing at the last bit as they're all zero).

What am I doing wrong here?

I'm awarding 500 points for a quick and working solution as this is the last bit I need to get the whole damn thing working, even though it's not pretty, and I need to get some numbers ready for a meeting.

Thanks
Sarah
0
Comment
Question by:ScuzzyJo
  • 18
  • 16
35 Comments
 
LVL 11

Expert Comment

by:Louis01
ID: 39656054
Hi Sarah
Using the "order by" when inserting records should not really matter, but since you are pressed for time, perhaps this would work?

SET DATEFORMAT dmy
SELECT *
INTO T_1213_RemAds
FROM (
        SELECT *, convert(smalldatetime,Rem_Date, 103) as Rem_Date_Date
        FROM [dbo].['1213 Remittance Advices$']
        WHERE ISDATE(Rem_Date) = 1
        ORDER BY convert(smalldatetime,Rem_Date, 103) ASC;
     ) as Rem_Date_Date

Open in new window


Can you not just order the table by Rem_Date_Date when exporting to excel?
0
 

Author Comment

by:ScuzzyJo
ID: 39656092
Hi Louis

Thanks for your code.  I'm running it now.

I can't just change the order in Excel as I'm only using Excel to see what is going on.  The RemAds table is made up of remittance advices and is used to allocate payments against another table in SQL.

Thanks
Sarah
0
 

Author Comment

by:ScuzzyJo
ID: 39656095
Hi Louis

I tried it and got the following error:

The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified.

Can you help?

Thanks
Sarah
0
 
LVL 11

Expert Comment

by:Louis01
ID: 39656102
How do you export it to EXCEL / import into EXCEL?
0
 

Author Comment

by:ScuzzyJo
ID: 39656112
Hi Louis

I use the Import and Export wizard.  I'd be happy to view it in SQL but don't know how as I'm a newbie.  I only know how to look at the top 200 rows.

Thanks
Sarah
0
 
LVL 11

Expert Comment

by:Louis01
ID: 39656117
In Sql Server Management Studio:
File > New > Query window...
>Select your database
>Enter:

select *
  from T_1213_RemAds
 order by [Your_Date_Column] ASC
0
 

Author Comment

by:ScuzzyJo
ID: 39656122
Hi Louis

They look correct.  How do I get that to work in the main query?

If I look at the top 200 rows of RemAds in the main query, they're definitely not in the the right order.

Thanks
Sarah
0
 
LVL 11

Expert Comment

by:Louis01
ID: 39656130
Hi Sarah
You cannot "order by" when inserting, and even if you could, it serves no purpose.

You have to do 2 actions - one for inserting and one for displaying:

--Inserting
SET DATEFORMAT dmy;

INSERT INTO myTable2 (col1, col2, col3)
SELECT col_a, col_b, col_n
  FROM myTable 1;

--Display
SELECT *
  FROM myTable2
 ORDER BY col_d;

Open in new window


To get the results into EXCEL, the simplest is to create a connection in EXCEL to you table and then edit the connection properties (definition tab) to set a custom SQL query with an ORDER BY clause.
0
 

Author Comment

by:ScuzzyJo
ID: 39656132
Hi Louis

I'm not really worried about the Excel bit as that will only be used to create ad hoc reports later on.  All the processing should be done in SQL.

Maybe I need to rephrase my question....

If I have a table of remittances which is created as part of my query and I need that table to be in date order so that it will allocate the earliest payments first (again as part of my query), how do I do that?  It might be that I was going about it in complete the wrong way with what I had.

Thanks
Sarah
0
 
LVL 11

Expert Comment

by:Louis01
ID: 39656143
Even if you could, it won't help to insert the data in the correct order as it would be reported in order of the Primary key of your table - first to last.

A table is not like a file.

Whenever you query data from a table, you have to sort it. Either by using an ORDER BY or in whatever tool you use to view the data.

I think perhaps you a worrying about something you do not need to worry about?

Louis
p.s. - this might help you: http://www.w3schools.com/sql/default.asp
0
 

Author Comment

by:ScuzzyJo
ID: 39656151
Hi Louis

I do need to worry about it or it will allocate later remittances first, which is wrong.  I've run it and looked at the results and it allocates May 2013 remittances before it allocates October 2012 ones, so I need to find a way to do it as the remittances are actually installment payments from the Student Loans Company.

I'll have to have a rethink and see what I can do.

Thanks for your help.

Sarah
0
 
LVL 11

Expert Comment

by:Louis01
ID: 39656158
...will allocate later remittances first...

Where do you want to view it? That is where you need to set the order.
0
 
LVL 11

Expert Comment

by:Louis01
ID: 39656163
What does your table look like?
0
 

Author Comment

by:ScuzzyJo
ID: 39656185
Hi Louis

It's not so much a case of viewing it as processing the data in it.  I'm only viewing it to check that it's working correctly.

I've attached a copy of my table.  You can see that the dates are not in the right order.  The ID field on the right is an identity column.

Thanks
Sarah
T-1213-RemAds.csv
0
 
LVL 11

Expert Comment

by:Louis01
ID: 39656219
Hi Sarah
When you say "processing the data in it". Where does this happen and how?

For instance, if I you have a table T-1213-RemAds with data in it, you would need to select the data from that table when you want to do some processing. The way this happens is usually by extracting the data into some structure using a SQL select statement.

So to select the data from your table in the correct order before processing it, you would do something like:
select * from  T-1213-RemAds order by New_Rem_Date_Date ASC

Maybe we need to look at how the "processing" you talk about happens. You'll need to sort the results in there before processing.
0
 
LVL 11

Expert Comment

by:Louis01
ID: 39656238
It is a common misconception that if you execute a SELECT * without an ORDER BY, that SQL Server will output your resultset in the same order as defined by your Clustering Key or even in the order that it was inserted.  It will MOST of the time use the clustering key of the table, but there are cases when it won't.  SQL Server will return data using what it believes is the fastest option available at that time.  

The only way to ensure the ordering of a given resultset is to use an ORDER BY.
0
 

Author Comment

by:ScuzzyJo
ID: 39656254
Hi Louis

The way it works is that it picks up the first remID from the remAds table and gets the corresponding NewSSN from the same table.  It then goes and gets selects the records from a different table (T_1213_Splits) where the SSN in this table matches NewSSN.  It selects those records into a temporary table.

This means that I should now have a remittance advice which could apply to a number of records in the temporary Splits table.

It goes down the temporary Splits table and allocates the amount from the RemAds table (using variables to do the calculations) until it runs out of remittance amount.

It sticks the amounts applied into the original Splits table and then deletes the temporary Splits table.

It then deletes the record from the remAds table it has allocated and starts the whole process again until there is nothing left in the remAds table.

The reason I've used a temporary table with an identity field is that I have a many to many relationship, i.e. there are loads of remittance advices with the the New_SSN and many records in the Splits table with matching SSNs.  This was the only way I could find to do it, i.e. restrict the remAds to one record at a time and scroll through them, applying to them to the many records in the Splits table.

Does that make sense?

Thanks
Sarah
0
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 
LVL 11

Expert Comment

by:Louis01
ID: 39656265
Hi Sarah

You mention
It goes down the temporary Splits table and allocates the amount from the RemAds table (using variables to do the calculations) until it runs out of remittance amount.
. How do you do this? Can you not just add " ORDER BY New_Rem_Date_Date
"?
0
 

Author Comment

by:ScuzzyJo
ID: 39656320
Hi Louis

It's quite complicated, particularly for a newbie!

Basically, it picks up various details from the remAds table and stores them to variables.  The main one is the remittance amount, which goes into @remAm.  It counts the number of records in the temporary Splits table and stores that to @Count.  It then takes the first record in the temporary Splits table and:

If the amounts are equal, sets the installment outstanding to 0, the variable @remOS (remittance outstanding) to 0 and the amount applied (@remApp) to whatever the amount was.  It then sets @Counter to whatever number is in @Count.

If @remAm > the temp. Splits amount, it sets the installment outstanding to 0, the variable @remOS to whatever is left of @remAm and @remAm to the amount applied.  It adds 1 to @Counter.

If the temp.Splits amount > @remAm, I don't want it to part allocate, so it leaves everything as it is but adds 1 to @Counter.

At the end of each "cycle", it tests to see whether or not @Counter >= @Count.  If it isn't, it goes through the process on the next record in the temp. Splits table.  If it is, it breaks out of the loop, deletes the temp. Splits table (after copying relevant data over into a master), deletes the relevant record in RemAds and starts the whole process again.

There may well be a better way to go about this but I put a question about it up on here and, apart from one person asking for some example data, nobody replied, so I had to try to find a way of doing it myself.

I've tried sticking ORDER BY New_Rem_Date_Date in various places, but it doesn't like any of them.

Thanks
Sarah
0
 
LVL 11

Expert Comment

by:Louis01
ID: 39656335
Can you see in the code a SQL SELECT statement containing the table you want to sort (T-1213-RemAds I assume)? If so, can you post it?
0
 

Author Comment

by:ScuzzyJo
ID: 39656435
Hi Louis

It it's the table you want, it's the one I posted as a csv earlier.  If it's the code that creates it, it was the bit when I opened the question.

Thanks
Sarah
0
 
LVL 69

Expert Comment

by:ScottPletcher
ID: 39656594
SELECT *
INTO T_1213_RemAds
FROM (
        SELECT *, convert(smalldatetime,Rem_Date, 103) as Rem_Date_Date
        FROM [dbo].['1213 Remittance Advices$']
        WHERE ISDATE(Rem_Date) = 1
     ) as Rem_Date_Date
ORDER BY
    CONVERT(datetime, Rem_Date_Date, 103) ASC;
0
 

Author Comment

by:ScuzzyJo
ID: 39656804
Hi Scott

I'm trying this and running it now.  It will take quite a long time to run, so I may not get back until tomorrow.

Thanks
Sarah
0
 
LVL 11

Expert Comment

by:Louis01
ID: 39658523
Hi Sarah

This might work for you:
SELECT *, convert(smalldatetime,Rem_Date, 103) as Rem_Date_Date
  INTO T_1213_RemAds
  FROM [dbo].['1213 Remittance Advices$']
 WHERE ISDATE(Rem_Date) = 1
 ORDER BY convert(smalldatetime,Rem_Date, 103);

Open in new window

0
 

Author Comment

by:ScuzzyJo
ID: 39658740
Hi

I'm still trying to sort this out, but have found another issue which I think I need to resolve first as it will cut the data size down and make this easier to see.  I'm now so confused, I hardly know which way is up :-)

I'll post the other question and will then get back to this once that one is resolved.

Thanks
Sarah
0
 

Author Comment

by:ScuzzyJo
ID: 39659190
Hi All

I've now tried these and neither seem to work.  I'm wondering if I can set an identity field when I import the data.  Would that keep the data in the correct order?  I'm importing from Excel and don't know how to do this anyway.

Thanks
Sarah
0
 
LVL 11

Expert Comment

by:Louis01
ID: 39659194
Hi Sarah
If you say neither seems to work; are you getting an error or are the process not returning the results you need?

Can you maybe post the whole processing code section?
0
 

Author Comment

by:ScuzzyJo
ID: 39659225
Hi Louis

It's in the results.  I've been running it for a bit and then looking at what order it does everything in.

I've posted the whole code, but it's probably not pretty, me being a newbie!  It's actually a bit more complicated now as I've changed the names of some of the tables.  The RemAds one is now partially copied into one called T_1213_Rem_SSN (which is, itself copied into T_1213_Rem_SSN_Source as a backup for me to look at if I need to).

There are lots of lines changed to comments while I test, so please ignore those and I can't even remember now where I got to with the above, so you might not see them in there, but I did try them.

Thanks
Sarah

USE SLC_1314;
--
DROP TABLE T_1213_RemAds;
--DROP TABLE T_1213_Rem_SSN_Source;
--DROP TABLE [dbo].[T_1213_Rem_SSN];
--DROP TABLE T_1213_Splits_Rem;
--
--Change the remittance date format to a date and sort on it
SET DATEFORMAT dmy
SELECT *
INTO T_1213_RemAds
FROM (
        SELECT *, convert(smalldatetime,Rem_Date, 103) as Rem_Date_Date
        FROM [dbo].['1213 Remittance Advices$']
        WHERE ISDATE(Rem_Date) = 1
     ) as Rem_Date_Date
ORDER BY remitId;
--
--Add the remittance columns into the Splits Final table
ALTER TABLE T_1213_Splits_Final Add remAmount float(10) default (0);
GO
ALTER TABLE T_1213_Splits_Final Add remDate smalldatetime default (01/01/1990);
GO
ALTER TABLE T_1213_Splits_Final Add remApplied float default (0);
GO
ALTER TABLE T_1213_Splits_Final Add remfromSSN nvarchar(255) Null;
GO
ALTER TABLE T_1213_RemAds Add remOutSt float(10);
GO
ALTER TABLE T_1213_RemAds Add remApplied float(10);
GO
ALTER TABLE T_1213_RemAds Add conCatRem nvarchar(255) null;
GO
--
--Set the remAmount and remApplied and remfromSSN fields to Null
UPDATE T_1213_Splits_Final SET remAmount = Null;
UPDATE T_1213_Splits_Final SET remApplied = Null;
UPDATE T_1213_Splits_Final SET remfromSSN = Null;
--
--
--UPDATE T_1213_RemAds SET conCatRem = conCat
--FROM T_1213_RemAds INNER JOIN T_1213_Splits_Final ON T_1213_RemAds.SSN = T_1213_Splits_Final.conCat
--WHERE T_1213_RemAds.Rem_Amount = T_1213_Splits_Final.payAmount;
--
--
SELECT SSN AS New_SSN, Rem_Amount AS New_Rem_Amount, Rem_Date_Date as New_Rem_Date_Date, remitID as New_remitID
INTO T_1213_Rem_SSN
FROM T_1213_RemAds
ORDER BY New_remitID
--    CONVERT(datetime, Rem_Date_Date, 103) ASC;
--select *
--  from T_1213_Rem_SSN
-- order by [New_Rem_Date_Date] ASC;
--
--Add unique ID fields
ALTER TABLE T_1213_Rem_SSN Add remId INT IDENTITY (1,1) ;
--
--Create a copy of Rem_SSN to keep as a source
SELECT *
INTO T_1213_Rem_SSN_Source
FROM T_1213_Rem_SSN;
--ALTER TABLE T_1213_Rem_SSN Add remIdent nvarchar(255);
--
--Concatenate the ID field and the SSN to get a unique field
--UPDATE T_1213_Rem_SSN SET remIdent = remId + New_SSN;
--
--Set remfromSSN to None
UPDATE T_1213_Splits_Final SET remfromSSN = 'None';
--
DECLARE @minID nvarchar(255);
DECLARE @remSSN AS nvarchar(255);
DECLARE @splitsSSN AS nvarchar(255);
DECLARE @conCatR AS nvarchar (255);
DECLARE @remAm AS float;
DECLARE @remApp AS float;
DECLARE @remDat as smalldatetime;
DECLARE @loanStart as float;
DECLARE @remBal as float;
DECLARE @loanOS as float;
DECLARE @remOS as float;
DECLARE @ssnCounter as int;
DECLARE @ssnCount as int;
--
-- get the first record
SELECT @minID = min(remId) FROM T_1213_Rem_SSN;
SELECT @remAm = New_Rem_Amount FROM T_1213_Rem_SSN WHERE remId = @minID;
SELECT @remDat = New_Rem_Date_Date FROM T_1213_Rem_SSN WHERE remId = @minID;
SELECT @splitsSSN = student_support_number FROM T_1213_Splits_Final WHERE student_support_number = @remSSN;
--WHERE @minID = min(New_SSN);
--
WHILE @minID is NOT NULL 
BEGIN
    -- do actual work, for instance, get the Name and Address for this ID
	SELECT @remAm=0;
	SELECT @loanStart=0;
	SELECT @remOS=0;
	SELECT @loanOS=0;
	SELECT @ssnCount=0;
	SELECT @ssnCounter = 0;
	SELECT @remSSN = New_SSN FROM T_1213_Rem_SSN WHERE remId = @minID;
	SELECT @remAm = New_Rem_Amount FROM T_1213_Rem_SSN WHERE remId = @minID;
	SELECT @remDat = New_Rem_Date_Date FROM T_1213_Rem_SSN WHERE remId = @minID;
	SELECT @remOS = New_Rem_Amount FROM T_1213_Rem_SSN WHERE remId = @minID;
	WHILE @remOS <> 0
--	WHILE T_1213_Splits_Original.remApplied IS NULL
	WHILE @ssnCount <= @ssnCounter
	BEGIN
--
--Create temporary table from Splits_Final with Filter
	DROP TABLE T_1213_Splits_Rem;
	SELECT student_support_number, payExpect, payAmount, conCatOrd AS cCORem, remAmount AS rARem, remDate AS rDRem, remfromSSN AS rfSRem, remApplied AS rApRem
	INTO T_1213_Splits_Rem
	FROM T_1213_Splits_Final
	WHERE student_support_number = @remSSN
	ORDER BY payExpect;
	SELECT @splitsSSN = student_support_number FROM T_1213_Splits_Rem WHERE student_support_number = @remSSN;
	SELECT @ssnCounter = COUNT(*) FROM T_1213_Splits_Rem WHERE student_support_number = @splitsSSN;
	IF @ssnCounter = 0 SELECT @remOS = 0;

	IF @splitsSSN IS NULL or @splitsSSN Like '' 
	WHILE @splitsSSN = @remSSN
--	SELECT @ssnCounter = 1;
      BREAK
		SELECT @conCatR = cCORem FROM T_1213_Splits_Rem WHERE student_support_number = @remSSN;
		SELECT @loanStart = payAmount FROM T_1213_Splits_Rem WHERE student_support_number = @remSSN;
		SELECT @loanOS=@loanStart;
		If @remOS > @loanOS 
		BEGIN
		SELECT @remOS = @remOS - @loanOS;
		SELECT @remApp = @loanOS;
		SELECT @loanOS = 0;
		END
		ELSE
		If @remOS = @loanOS 
		BEGIN
		SELECT @remOS = 0;
		SELECT @remApp = @loanOS;
		SELECT @loanOS = 0;
		SELECT @ssnCount = @ssnCounter;
		END
		ELSE
		BEGIN
		SELECT @remApp =0;
		SELECT @loanOS = @loanStart;
		SELECT @ssnCount = @ssnCounter;
		END
		UPDATE T_1213_Splits_Rem SET rApRem = @remApp WHERE student_support_number = @remSSN;
		UPDATE T_1213_Splits_Rem SET rARem = @remAm FROM T_1213_Rem_SSN WHERE student_support_number = @remSSN;
		UPDATE T_1213_Splits_Rem SET rDrem = @remDat FROM T_1213_Rem_SSN WHERE student_support_number = @remSSN;
		UPDATE T_1213_Splits_Rem SET rfSRem =@minID FROM T_1213_Rem_SSN WHERE student_support_number = @remSSN;
		UPDATE T_1213_RemAds SET conCatRem = @conCatR FROM T_1213_Splits_Rem WHERE SSN = @remSSN;
		UPDATE T_1213_RemAds SET remOutSt = @remOS FROM T_1213_Splits_Rem WHERE SSN = @remSSN;
		UPDATE T_1213_RemAds SET remApplied = @remApp FROM T_1213_Splits_Rem WHERE SSN = @remSSN;
		SELECT @ssnCount = @ssnCount + 1;
		IF @ssnCount > @ssnCounter SELECT @remOS = 0;
		IF @remOS = 0
		BREAK
	END

--    UPDATE T_1213_RemAds SET Rem_Amount = @remAm + 0.13 FROM T_1213_Rem_SSN WHERE SSN = @minID
     -- get the next record
	 DELETE FROM T_1213_Rem_SSN WHERE remId = @minID;
--
--	Copy the data back into the Splits_Final table and then drop the Splits_Rem table
	UPDATE T_1213_Splits_Final SET remAmount=rARem, remDate = rDRem, remApplied = rApRem, remfromSSN = rfSRem
	FROM T_1213_Splits_Final INNER JOIN T_1213_Splits_Rem ON T_1213_Splits_Final.conCatOrd = T_1213_Splits_Rem.cCORem;
--	DROP TABLE T_1213_Splits_Rem;
    SELECT @minID = min(remId) FROM T_1213_Rem_SSN WHERE @minID < remId;
END

Open in new window

0
 

Author Comment

by:ScuzzyJo
ID: 39659241
Hi All

I think I may have solved it using:

http://blog.sqlauthority.com/2013/05/30/sql-server-add-identity-column-to-table-based-on-order-of-another-column/

I'm just cleaning up the code as necessary and will test it.  Fingers crossed!!!!

Thanks
Sarah
0
 
LVL 11

Expert Comment

by:Louis01
ID: 39659250
Hi Sarah, I think the problem is on your assigning a PK to T_1213_Rem_SSN:
ALTER TABLE T_1213_Rem_SSN Add remId INT IDENTITY (1,1) ;

Further on you select MIN ID which is not going to correlate to MIN date
0
 
LVL 11

Expert Comment

by:Louis01
ID: 39659255
I was going to suggest you add a clustered index on date asc before adding the PK, but see you already found your way. I'd have no objections if you request the Q to be closed, I don;t think I helped.

Good Luck
Louis
0
 

Author Comment

by:ScuzzyJo
ID: 39659272
Hi Louis

I'm just testing it.  It it works OK, I will still apply points as I've learned quite a bit from this so I only think that's fair.

Thanks
Sarah
0
 

Author Comment

by:ScuzzyJo
ID: 39659322
Hi All

It seems to work - fantastic!  It'll take about 5 hours to run the whole thing, so I can't be sure until then.  Louis, could you please explain to me what a PK is and what clustered indexes are?  Then I'll close the question and award points.  If it turns out not to work, I can always reopen the question (I think!).

Thanks
Sarah
0
 
LVL 11

Accepted Solution

by:
Louis01 earned 500 total points
ID: 39661532
By PK, I meant Primary Key, which in this case is completely wrong as it is not a primary key... I'm simply talking about the ID column you add in line 56.

If you add a CLUSTERED INDEX before line 56:
CREATE CLUSTERED INDEX IX_T_1213_Rem_SSN ON T_1213_Rem_SSN (New_Rem_Date_Date ASC)
your remId would be assigned in order of the CLUSTERED index.

You do not need to do that though; You could change line 85 to:
SET @minID = (SELECT  TOP 1 remId FROM T_1213_Rem_SSN ORDER BY New_Rem_Date_Date ASC)
and then line 168 to:
SET @minID = (SELECT  TOP 1 remId FROM T_1213_Rem_SSN WHERE remId > @minID ORDER BY New_Rem_Date_Date ASC);
0
 

Author Closing Comment

by:ScuzzyJo
ID: 39662648
Although I managed to resolve this with help from elsewhere, Louis was very helpful and I learned quite a bit.  He also explained how/why the solution worked.
0

Featured Post

Maximize Your Threat Intelligence Reporting

Reporting is one of the most important and least talked about aspects of a world-class threat intelligence program. Here’s how to do it right.

Join & Write a Comment

Having an SQL database can be a big investment for a small company. Hardware, setup and of course, the price of software all add up to a big bill that some companies may not be able to absorb.  Luckily, there is a free version SQL Express, but does …
Everyone has problem when going to load data into Data warehouse (EDW). They all need to confirm that data quality is good but they don't no how to proceed. Microsoft has provided new task within SSIS 2008 called "Data Profiler Task". It solve th…
Using examples as well as descriptions, and references to Books Online, show the documentation available for date manipulation functions and by using a select few of these functions, show how date based data can be manipulated with these functions.
Via a live example, show how to set up a backup for SQL Server using a Maintenance Plan and how to schedule the job into SQL Server Agent.

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now