Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
| Author |
Topic |
|
gotafly
Yak Posting Veteran
54 Posts |
Posted - 2007-09-18 : 10:23:08
|
| I am looking for the same last name 3 chars of the first and 8 of the address. This seems to bring back almost all the recordsSELECT survey_rel_personalInfo.individualSurveyID AS ID, SUBSTRING(name.first, 0, 3) AS theFirstName, SUBSTRING(address.line1, 0, 8) AS theAddress, name.lastFROM individualSurvey RIGHT OUTER JOIN survey_rel_personalInfo ON individualSurvey.individualSurveyID = survey_rel_personalInfo.individualSurveyID LEFT OUTER JOIN address LEFT OUTER JOIN personalInfo ON address.addressID = personalInfo.addressID LEFT OUTER JOIN name ON personalInfo.nameID = name.nameID ON survey_rel_personalInfo.personalInfoID = personalInfo.personalInfoIDGROUP BY survey_rel_personalInfo.individualSurveyID, SUBSTRING(name.first, 0, 3), SUBSTRING(address.line1, 0, 8), name.last |
|
|
jimf
Master Smack Fu Yak Hacker
2875 Posts |
Posted - 2007-09-18 : 10:26:46
|
| 0 is not a start position for the SUBSTRING function. Since you just want the first 3 chars and first 8 chars try using LEFT(name.first, 3) and LEFT(address.line1, 8). Also, you are using outer joins, which will return results even if there is no match.Jim |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-09-18 : 10:27:40
|
[code]SELECT survey_rel_personalInfo.individualSurveyID AS ID, SUBSTRING(name.first, 1, 3) AS theFirstName, SUBSTRING(address.line1, 1, 8) AS theAddress, name.lastFROM individualSurveyLEFT JOIN survey_rel_personalInfo ON individualSurvey.individualSurveyID = survey_rel_personalInfo.individualSurveyIDLEFT JOIN personalInfo ON survey_rel_personalInfo.personalInfoID = personalInfo.personalInfoIDLEFT JOIN address ON address.addressID = personalInfo.addressIDLEFT JOIN name ON personalInfo.nameID = name.nameID GROUP BY survey_rel_personalInfo.individualSurveyID, SUBSTRING(name.first, 1, 3), SUBSTRING(address.line1, 1, 8), name.last[/code] E 12°55'05.25"N 56°04'39.16" |
 |
|
|
gotafly
Yak Posting Veteran
54 Posts |
Posted - 2007-09-18 : 10:34:15
|
| Well I tried the following and got the same amountSELECT survey_rel_personalInfo.individualSurveyID AS ID, LEFT(name.FIRST,3) AS theFirstName, LEFT(address.line1,8) AS theAddress, name.LASTFROM individualSurvey LEFT JOIN survey_rel_personalInfo ON individualSurvey.individualSurveyID = survey_rel_personalInfo.individualSurveyID LEFT JOIN personalInfo ON survey_rel_personalInfo.personalInfoID = personalInfo.personalInfoID LEFT JOIN address ON address.addressID = personalInfo.addressID LEFT JOIN name ON personalInfo.nameID = name.nameIDGROUP BY survey_rel_personalInfo.individualSurveyID,LEFT(name.FIRST,3),LEFT(address.line1,8),name.LAST |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-09-18 : 10:36:44
|
I can't tell your business logic, but try to replace some LEFT JOINs with INNER JOINs, starting at top. E 12°55'05.25"N 56°04'39.16" |
 |
|
|
gotafly
Yak Posting Veteran
54 Posts |
Posted - 2007-09-18 : 10:40:28
|
| Forgot one thing.....HAVING COUNT(*) > 1Now it seems to work |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-09-18 : 10:42:01
|
Oh, that little thing...  E 12°55'05.25"N 56°04'39.16" |
 |
|
|
gotafly
Yak Posting Veteran
54 Posts |
Posted - 2007-09-18 : 10:44:48
|
| now I have another problem. I need to get the duplicates, Group By only brings back one. Any suggestions |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-09-18 : 10:52:51
|
If record A has 4 records in total, do you want to see all four records or only the three duplicates? E 12°55'05.25"N 56°04'39.16" |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-09-18 : 10:57:02
|
[code]SELECT ID, theFirstName, theAddress, theLastNameFROM ( SELECT survey_rel_personalInfo.individualSurveyID AS ID, SUBSTRING(name.first, 1, 3) AS theFirstName, SUBSTRING(address.line1, 1, 8) AS theAddress, name.last AS theLastName, SUM(1) OVER (PARTITION BY survey_rel_personalInfo.individualSurveyID) AS SumID FROM individualSurvey LEFT JOIN survey_rel_personalInfo ON individualSurvey.individualSurveyID = survey_rel_personalInfo.individualSurveyID LEFT JOIN personalInfo ON survey_rel_personalInfo.personalInfoID = personalInfo.personalInfoID LEFT JOIN address ON address.addressID = personalInfo.addressID LEFT JOIN name ON personalInfo.nameID = name.nameID ) AS dWHERE SumID > 1[/code] E 12°55'05.25"N 56°04'39.16" |
 |
|
|
gotafly
Yak Posting Veteran
54 Posts |
Posted - 2007-09-18 : 11:02:08
|
| I get "The OVER SQL construct or statement is not supported."Here is my first shot:ALTER PROCEDURE [dbo].[prGetMultipleEntryReport] ----------------------------------------------------------------------------Variables passed in to the stored procedure--------------------------------------------------------------------------@userID int,@sortExpression varchar(30)ASSET CONCAT_NULL_YIELDS_NULL OFF DECLARE @surveyID numeric(18,0)DECLARE @surveyTypeID intDECLARE @lastName varchar(60)DECLARE @firstName varchar(60)DECLARE @latitude varchar(50)DECLARE @longitude varchar(50)DECLARE @SQL varchar(1000)-------------------------------------------------Create Temporary Table-----------------------------------------------CREATE TABLE #tmpSurvey (surveyID numeric(18,0))-------------------------------------------------Create Cursor-----------------------------------------------DECLARE csrFindMatches CURSORREAD_ONLY-----------------------------------------------FOR SELECT DISTINCT survey_rel_personalInfo.individualSurveyID AS ID, name.last AS lastName, SUBSTRING(name.first, 0, 3) AS theFirstName, SUBSTRING(CAST(personalInfo.latitude AS varchar(20)), 0, 8) AS latitude, SUBSTRING(CAST(personalInfo.longitude AS varchar(20)), 0, 8) AS longitudeFROM survey_rel_personalInfo LEFT OUTER JOIN personalInfo ON survey_rel_personalInfo.personalInfoID = personalInfo.personalInfoID LEFT OUTER JOIN individualSurvey ON survey_rel_personalInfo.individualSurveyID = individualSurvey.individualSurveyID LEFT OUTER JOIN name ON name.nameID = personalInfo.nameIDWHERE (personalInfo.countyID <> 0) AND personalInfo.countyID IN (SELECT levelID FROM userRights WHERE userID = @userID AND accessLevel = 2) OR personalInfo.municipalityID IN (SELECT levelID FROM userRights WHERE userID = @userID AND accessLevel = 2)-----------------------------------------------OPEN csrFindMatchesFETCH NEXT FROM csrFindMatches INTO @surveyID, @lastName, @firstName, @latitude, @longitudeWHILE (@@fetch_status <> -1)BEGIN IF (@@fetch_status <> -2) BEGIN INSERT INTO #tmpSurvey (surveyID) SELECT survey_rel_personalInfo.individualsurveyID FROM survey_rel_personalInfo LEFT OUTER JOIN personalInfo ON survey_rel_personalInfo.personalInfoID = personalInfo.personalInfoID LEFT OUTER JOIN [name] ON personalInfo.nameID = [name].nameID WHERE (name.LAST LIKE '%' + @lastName + '%') AND (name.FIRST LIKE '%' + @firstName + '%') AND (CAST(personalinfo.latitude AS VARCHAR) LIKE '%' + @latitude + '%') AND (CAST(personalinfo.longitude AS VARCHAR) LIKE '%' + @longitude + '%') AND (personalinfo.personalinfoid <> @surveyID) END FETCH NEXT FROM csrFindMatches INTO @surveyID, @lastName, @firstName, @latitude, @longitudeEND-------------------------------------------------Free up resources-----------------------------------------------CLOSE csrFindMatchesDEALLOCATE csrFindMatches--------------------------------------------------------------------------Select data from #tmpSurvey to be returned--and displayed in a datagrid.------------------------------------------------------------------------SET @SQL = 'SELECT DISTINCT #tmpSurvey.surveyID AS [ID], [name].last + '', '' + [name].first AS personName, address.line1 + '' '' + address.line2 as personAddress, address.city, ''('' + phone.phoneArea + '')'' + phone.phonePrefix + ''-'' + phone.phoneLine AS phone, individualsurvey.lastUpdate AS lastUpdate FROM #tmpSurvey LEFT OUTER JOIN individualsurvey ON #tmpSurvey.surveyID = individualsurvey.individualsurveyID LEFT OUTER JOIN survey_rel_personalInfo ON individualsurvey.individualsurveyID = survey_rel_personalInfo.individualsurveyID LEFT OUTER JOIN personalInfo ON survey_rel_personalInfo.personalInfoID = personalInfo.personalInfoID LEFT OUTER JOIN address ON personalInfo.addressID = address.addressID LEFT OUTER JOIN phone ON personalInfo.phoneID1 = phone.phoneID LEFT OUTER JOIN [name] ON personalInfo.nameID = [name].nameID ORDER BY ' + @sortExpressionEXEC (@SQL) |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2007-09-18 : 11:07:54
|
Why, Oh Heavenly Father why, are you allowing this man to use a CURSOR?And where the heck did Longitude and Latitude come from?If you are not serious about your alleged problem, I see not point in helping you further.You might have better luck if you provide ALL information from the start, and posting accurate and proper sample data together with expected outout. It will also help us if you clearly stated your problem and what you are trying to accomplish! E 12°55'05.25"N 56°04'39.16" |
 |
|
|
gotafly
Yak Posting Veteran
54 Posts |
Posted - 2007-09-18 : 11:13:50
|
| I took lat long out. Just was showing what I started off with |
 |
|
|
|
|
|
|
|