Solved

SQL rewrite

Posted on 2011-09-08
7
358 Views
Last Modified: 2012-05-12

I have the SQl query below which list the stores

Whenever i get "All city types" in the citytypename fields , i DO NOT need to list the other rows for the
particular storelocationid

Result

71      8      0      All City Types      West      Dhanalakshmi store          All Cities      All States
71      8      1      Tier 2              West      Dhanalakshmi store          Bangalore      Karnataka
71      8      2      Tier 2                    West      Dhanalakshmi store   Ahmedabad      Gujarat      


how i will rewrite my query for this?

SELECT  LL.StoreLocationID
       ,LC.[StoreID]
       ,ISNULL(LC.CityID,0) CityID
       ,ISNULL(C.CityTypeName,'All City Types') CityTypeName
       ,ISNULL(LL.RegionName,'All Regions') RegionName
       ,L.[Name] StoreName
       ,ISNULL(C.Name,'All Cities') AS CityName
       ,ISNULL(S.Name, 'All States') AS StateName
FROM [StoreCity] LC
		INNER JOIN [Store] L ON L.[StoreID] = LC.[StoreID] 
		INNER JOIN [StoreLocation] LL ON LL.StoreID=LC.StoreID
		LEFT OUTER JOIN [City] C ON LC.CityID = C.CityID
		LEFT OUTER JOIN [State] S ON C.StateID = S.StateID
		where StoreLocationID =  71

Open in new window

0
Comment
Question by:PeteEngineer
  • 3
  • 3
7 Comments
 
LVL 10

Expert Comment

by:OnALearningCurve
ID: 36503131
Hi PeteEngineer,

How about the code attached

HTH,

Mark.
SELECT  LL.StoreLocationID
       ,LC.[StoreID]
       ,ISNULL(LC.CityID,0) CityID
       ,ISNULL(C.CityTypeName,'All City Types') CityTypeName
       ,CASE( WHEN (C.CityTypeName IS NULL) THEN (ISNULL(LL.RegionName,'All Regions')) ELSE NULL END) RegionName
       ,CASE( WHEN (C.CityTypeName IS NULL) THEN (L.[Name]) ELSE NULL END) StoreName
       ,CASE( WHEN (C.CityTypeName IS NULL) THEN (ISNULL(C.Name,'All Cities')) ELSE NULL END) AS CityName
       ,CASE( WHEN (C.CityTypeName IS NULL) THEN (ISNULL(S.Name, 'All States')) ELSE NULL END) AS StateName
FROM [StoreCity] LC
		INNER JOIN [Store] L ON L.[StoreID] = LC.[StoreID] 
		INNER JOIN [StoreLocation] LL ON LL.StoreID=LC.StoreID
		LEFT OUTER JOIN [City] C ON LC.CityID = C.CityID
		LEFT OUTER JOIN [State] S ON C.StateID = S.StateID
		where StoreLocationID =  71

Open in new window

0
 
LVL 59

Expert Comment

by:Kevin Cross
ID: 36503243
You can try a NOT EXISTS. Let's start with an OR in single query. Other option might be to use UNION where you select just the 'all city types' rows and then join in those other cities where there does not exist an 'all city types' row for that store location ID.

Let me know how this works:
SELECT  LL.StoreLocationID
       ,LC.[StoreID]
       ,ISNULL(LC.CityID,0) CityID
       ,ISNULL(C.CityTypeName,'All City Types') CityTypeName
       ,ISNULL(LL.RegionName,'All Regions') RegionName
       ,L.[Name] StoreName
       ,ISNULL(C.Name,'All Cities') AS CityName
       ,ISNULL(S.Name, 'All States') AS StateName
FROM [StoreCity] LC
	INNER JOIN [Store] L ON L.[StoreID] = LC.[StoreID] 
	INNER JOIN [StoreLocation] LL ON LL.StoreID=LC.StoreID
	LEFT OUTER JOIN [City] C ON LC.CityID = C.CityID
	LEFT OUTER JOIN [State] S ON C.StateID = S.StateID
WHERE StoreLocationID =  71
AND (
   /* current row is 'All City Types' */
   C.CityTypeName IS NULL
   OR 
   /* current row is not 'All City Types', 
      but there does not exist another row that is. */
   NOT EXISTS (
      SELECT 1
	  FROM [StoreLocation] LL2 ON LL2
	  INNER JOIN [StoreCity] LC2 ON LC2.[StoreID] = LL2.[StoreID]
	  INNER JOIN [City] C2 ON C2.[CityID] = LC2.[CityID]
	  WHERE LL2.StoreLocationID = LL.StoreLocationID
	  AND C2.CityTypeName IS NULL
   )
)

Open in new window

0
 
LVL 8

Author Comment

by:PeteEngineer
ID: 36507804
:OnALearning…:

I am getting this error

Msg 156, Level 15, State 1, Line 5
Incorrect syntax near the keyword 'WHEN'.
0
NAS Cloud Backup Strategies

This article explains backup scenarios when using network storage. We review the so-called “3-2-1 strategy” and summarize the methods you can use to send NAS data to the cloud

 
LVL 8

Author Comment

by:PeteEngineer
ID: 36507813
mwvisa1: I am getting the following error :


Msg 156, Level 15, State 1, Line 23
Incorrect syntax near the keyword 'ON'.
0
 
LVL 8

Author Comment

by:PeteEngineer
ID: 36507816
I have remove the ON statement,so the query is working .....


but there is no change in the query results i posted above
0
 
LVL 59

Expert Comment

by:Kevin Cross
ID: 36507821
Sorry, I started to type this with [City] table first, then thought it may not be needed and in my shifting around I did not get rid of an ON clause. Just delete it.

i.e., run like this:

SELECT  LL.StoreLocationID
       ,LC.[StoreID]
       ,ISNULL(LC.CityID,0) CityID
       ,ISNULL(C.CityTypeName,'All City Types') CityTypeName
       ,ISNULL(LL.RegionName,'All Regions') RegionName
       ,L.[Name] StoreName
       ,ISNULL(C.Name,'All Cities') AS CityName
       ,ISNULL(S.Name, 'All States') AS StateName
FROM [StoreCity] LC
	INNER JOIN [Store] L ON L.[StoreID] = LC.[StoreID] 
	INNER JOIN [StoreLocation] LL ON LL.StoreID=LC.StoreID
	LEFT OUTER JOIN [City] C ON LC.CityID = C.CityID
	LEFT OUTER JOIN [State] S ON C.StateID = S.StateID
WHERE StoreLocationID =  71
AND (
   /* current row is 'All City Types' */
   C.CityTypeName IS NULL
   OR 
   /* current row is not 'All City Types', 
      but there does not exist another row that is. */
   NOT EXISTS (
      SELECT 1
	  FROM [StoreLocation] LL2
	  INNER JOIN [StoreCity] LC2 ON LC2.[StoreID] = LL2.[StoreID]
	  INNER JOIN [City] C2 ON C2.[CityID] = LC2.[CityID]
	  WHERE LL2.StoreLocationID = LL.StoreLocationID
	  AND C2.CityTypeName IS NULL
   )
)

Open in new window

0
 
LVL 59

Accepted Solution

by:
Kevin Cross earned 500 total points
ID: 36507827
If that is the case, then there is probably something in the NOT EXISTS joins that is not right. The basics is you need to pick rows that qualify as 'All City Types' or choose those rows where there doesn't exist another row over whatever criteria you set that doesn't qualify as an 'All City Types' row. Maybe it can't be linked by StoreLocationID?
0

Featured Post

Best Practices: Disaster Recovery Testing

Besides backup, any IT division should have a disaster recovery plan. You will find a few tips below relating to the development of such a plan and to what issues one should pay special attention in the course of backup planning.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

I'm trying, I really am. But I've seen so many wrong approaches involving date(time) boundaries I despair about my inability to explain it. I've seen quite a few recently that define a non-leap year as 364 days, or 366 days and the list goes on. …
If you have heard of RFC822 date formats, they can be quite a challenge in SQL Server. RFC822 is an Internet standard format for email message headers, including all dates within those headers. The RFC822 protocols are available in detail at:   ht…
Microsoft Active Directory, the widely used IT infrastructure, is known for its high risk of credential theft. The best way to test your Active Directory’s vulnerabilities to pass-the-ticket, pass-the-hash, privilege escalation, and malware attacks …
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit https://www.mail-signatures.com/articles/signature-templates/?sts=6651 If you want to manage em…

789 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