|
Everyone has a Split function right! If you don't the why not!
<br />
DECLARE @racer1 VARCHAR(1000)<br />
set @racer1 = 'Piquet,Alonso,Massa,Heidfeld,Piquet,Hamilton,Kovalainen,Piquet,Raikonen,Trulli'<br />
<br />
SELECT Item, COUNT(*) Dupes<br />
FROM dbo.fn_Split(@racer1, ',')<br />
GROUP BY Item<br />
HAVING COUNT(*) > 1
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Try this method
Declare @tblRacer as table(Racer varchar(50))
insert into @tblRacer(Racer)
select 'Piquet'
union all select 'Alonso'
union all select 'Massa'
union all select 'Heidfeld'
union all select 'Hamilton'
union all select 'Kovalainen'
union all select 'Raikonen'
union all select 'Trulli'
union all select 'Trulli'
if ((select count(Racer) from @tblRacer group by Racer having count(Racer) > 1) > 1)
begin
declare @msgError as varchar(50)
set @msgError = 'Error: Same racer name'
select @msgError
end
else
begin
declare @msgOK as varchar(50)
set @msgOK = 'OK: Diferent racer'
select @msgOK
end
|
|
|
|
|
thanks for the posts i am going to see what i make from it
about hamilton i really don´t care!
|
|
|
|
|
Hello,
I was wondering if someone could help me with something SQL related. I'm trying to create a table that has the following granularity:
Client
Unit
Month
Year
I then want a few calculations at that granularity. The calculations are:
Amount
Sales
Costs
Amount is just a straight sum of the amount field in the existing table.
But to determine sales and costs I need to evaluate based on a n_code. So when the n_codes is > 5000 then Costs = sum(amount). When the n_codes is between 4000 and 4999 then Sales = sum(amount).
I do not want the n_codes in my output.
|
|
|
|
|
Try using Case statements.
Example:
Select
Sum(Amount) as Amount
,Sum(Case When n_Codes > 5000 Then Amount Else 0 End) as Sales
,Sum(Case When n_Codes Between 4000 and 4999 Then Amount Else 0 End) as Costs
From ...
Join...
...
That should give you something to work off of.
|
|
|
|
|
Lash20, use Scott's approach since it's much simpler than the ones I suggested.
Mika
I think that after midnight I shouldn't try to solve anything more complicated than how to get bed...
|
|
|
|
|
Hi,
If I understood you question correctly, you have several options. Few of those:
1. Create a query where you decide in which column you bring amount. Use CASE WHEN structure for decision and then use outer query to calculate sums and counts. For example
SELECT SUM(Cost), SUM(Sales), SUM(Amount)...
FROM (
SELECT Cost = CASE WHEN n_codes > 5000 THEN Amount ELSE 0 END,
Sales = CASE WHEN n_codes >= 4000 AND n_codes < 5000 THEN AMOUNT ELSE 0 END,
Amount
FROM...)
2. Use scalars for columns, for example
SELECT SUM(Amount),
(SELECT SUM(Amount) FROM ... WHERE n_Codes > 5000 AND correlation to outer part if any),
...
FROM ...
Haven't tested those so there may be typos and such but they should give you the idea.
Hope this helps,
Mika
|
|
|
|
|
Thanks guys worked like a charm..
|
|
|
|
|
This isn't a programming question... so thats why i'm here
I'm working on a system thats working with some stock market data (this is a personal project at home) The system is collecting about 7 million records a week, and its really starting to slow down. I've done all the SQL optimizations i can think of (indexing, and what not) but i'm running into a road block with hardware i think... during the day when its downloading new quotes its flatlined at 100% CPU usage all day, and i'm seeing an increase of errors due to timeouts (when attempting to submit more data to sql). Currently the database engine is running on 1 dell poweredge 2550, i have 4 other servers with similar hardware (and 5 more that aren't really servers) so i'm looking for a way to distribute the load amoung the other servers. I've started to think about clustering, but i believe thats only for error tolerance (incase the server goes down) anyone have anyother suggestions?
modified on Wednesday, July 23, 2008 6:11 PM
|
|
|
|
|
Don't bother watching poorly-performing stocks?
Roll-up and/or archive old data?
Only store new records when some threshold difference is reached?
|
|
|
|
|
Distributed Partitioned views are ideal for this massive data scenario.
Need a C# Consultant? I'm available.
Happiness in intelligent people is the rarest thing I know. -- Ernest Hemingway
|
|
|
|
|
i'm thinking this is what i'm going to do.
|
|
|
|
|
With a bit of reengineering, I'd consider moving the load process out into a message queue and then load the data into a separate database on a separate server. Then, periodically do a bulk insert from this table.
modified on Wednesday, July 23, 2008 3:49 PM
|
|
|
|
|
StevenWalsh wrote: its flatlined at 100% CPU usage all day
What process is usingthe CPU?
What is the physical disk subsystem? IDE drives can be very processor intensive, especially when writing.
StevenWalsh wrote: I've done all the SQL optimizations i can think of (indexing, and what not)
What indices do you have? Adding indices will only help querying performance - it will slow down inserts, updates and deletes.
Are you in auto-commit mode, with an implicit commit after every insert, or do you perform number of inserts in a transaction and then commit? Auto-commit hurts performance since the database engine updates the indices for every insert.
As a suggestion, if you are not querying the data during the day, you could consider writing it to a formatted text file, and use SQL Servers bulk copy to load it once per day.
|
|
|
|
|
Graham Bradshaw wrote: IDE drives can be very processor intensive, especially when writing.
I thought that this was true only when PIO mode was active, but this was a thing of the 90's and newer disks used DMA, am I wrong?
|
|
|
|
|
It depends on the drive itself, the controller hardware and BIOS, and the driver used by the OS.
Put it this way - there's a good reason why high performance servers use SCSI/SAS.
|
|
|
|
|
Actually the servers are using a SCSI controller with 4 10k rpm drives. i'd have to check the auto-commit tip, never thought about that before i can't do the bulk copies unfortuantely since i query the data during the day.
|
|
|
|
|
StevenWalsh wrote: i can't do the bulk copies unfortuantely since i query the data during the day.
You can if you load the data into a staging database and use a linked database with a cross database view on it. Then, in the quiet periods do the bulk insert.
|
|
|
|
|
Are any the indexes clustered on your large tables?
If you do you may have a lot of page splitting going on which can really slow things down with inserting 7m rows.
Do you have the transaction log on a separate drive?
Is the database on a separate drive from the application?
Continuous effort - not strength or intelligence - is the key to unlocking our potential.(Winston Churchill)
|
|
|
|
|
depending on the db used, and how you set it up it may have to grow itself to be able to store that data i.e. if you origionally set up the db for 3gb, and its taking up all 3 or has gotten bigger, any time you insert you'll have to wait on the database to go find another contiguous section of disc to put the new data on. on sql server 2k you can set the inital size and the growth rate as a percentage or fixed amount, we have a 1tb raid array so we can let it grow 1gb at a time, which lets it work for a while without needing new space. we also created the db several times larger than it was when we built the server, so it wouldnt need to grow for a long time. Contiguous disk space is your friend for data heavy applications, because if you can put all a table or tables together it will reduce seek time. also disabling the log file or setting the log file up to have a large amount of space could help too, if its logging the inserts then that file will get pretty big and have to go find more space for itself.
i've greatly sped up our db server and other databases by forcing it to clear the log file, and giving it quite abit of space for it since we regularly upload (insert, delete, update) over 500 million rows in a handful of tables. we upload them to a temp database on the main server then do compares to deteremin what needs to be added removed or changed, then run those queries, so we arent adding 500 million rows every few months, but we do have to mess with that much data, the inserts are ususally only 20 or 30 million, but it does run fairly fast(20 to 30 minutes at most including initial upload done with bcp) on the new machine. top end dell 5u 15k rpm sata2 drives..its sweet.
hopefully this was somewhat helpful
Please remember to rate helpful or unhelpful answers, it lets us and people reading the forums know if our answers are any good.
|
|
|
|
|
Actually that helps quite a bit, thanks for the advice
|
|
|
|
|
not a problem, the disadvantage is that if you wanted to make it all contiguous you'd have to drop the DB, defrag the hdd then recreate the db larger than it was before. but that would require a decent amount of downtime(a few hours depending on your server) and enough storage some place to back up your current data so it could be restored. also on mass inserts, i've found it usefull to drop the indices and recreate them after the insert, if you can do it all at once. you should see a noticable performance improvement if you try that, doing a lot of inserts and updates to an index can(sometimes) corrupt it quite easily, thus slowing down performance for any action on that table, or anything that is related to that table.
Please remember to rate helpful or unhelpful answers, it lets us and people reading the forums know if our answers are any good.
|
|
|
|
|
I'm having an access database table which consists of 4 different columns Day, Month, and Year-1 and Year-2 (e.g 22-July-2008 is present in Database as: 07, 22, 20, 08) as columns. So I have added a new Date column in a newly created Dataset which concatenates all these 4 fields and show it as a single date field. But now the problem is that, I'm not getting anywhere with how to link this newly created dataset with my Crystal Report.
Thanking you in anticipation.
My C#.Net code is as shown below:
private void button1_Click(object sender, System.EventArgs e)
{
try
{
myCon.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\temp\as400.mdb";
myCon.Open();
string sqlQuery = "Select [CLNT#], CNAME, [CSS#], CADMHH, CADMYY, CADMMM, CADMDD, CSEX from SAMFILE_CLIENTP";
myAdp = new OleDbDataAdapter(sqlQuery, myCon);
PIN_DataSet PDS = new PIN_DataSet();
PDS.Clear();
myAdp.Fill(PDS,"SAMFILE_CLIENTP");
DataSet newPDS = new DataSet();
newPDS = PDS.Copy();
DataColumn dCol = new DataColumn(newPDS.Tables[0].Columns.Add("DT", typeof(String)).ToString());
for(Int32 i = 0; i < newPDS.Tables[0].Rows.Count; i++)
{
DataRow row = newPDS.Tables[0].Rows[i];
row["DT"] = row["CADMMM"].ToString() + "/" + row["CADMDD"].ToString() + "/" + row["CADMHH"].ToString() + row["CADMYY"].ToString();
}
PIN_Crystal_Report myReport = new PIN_Crystal_Report();
myReport.SetDataSource(PDS);
crystalReportViewer1.ReportSource = myReport;
}
catch(Exception obj)
{
MessageBox.Show(obj.Message, "X'eption");
}
}
|
|
|
|
|
Hi,
If you have already linked the PDS dataset to Crystal, don't create a new dataset. Instead, add a new datatable to existing PDS dataset and then add rows to it. After this you can see two tables at Crystal side.
Hope this helps,
Mika
|
|
|
|
|
Thank You Mika, I did it the other way round. After adding the new columns to the dataset. I have updated the dataset schema using .WriteXMLSchema (), this infact, updates the old schema with the one and shows the newsly added column in the fields explorer section of the Crystal Report.
Dataset has been updated at its actual location:
PDS.WriteXmlSchema(@"C:VS_Projects\PIN_DataSet.xsd");
And also, I didn't add the new dataset, I have used the old one instead.
Thanks again for all the help extended.
|
|
|
|
|