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 |
|
johnnybutler7
Starting Member
16 Posts |
Posted - 2008-06-11 : 11:29:44
|
| Hi,I have some sql and i expect a row back with some information even if there is nothing. What i want to happen is when it returns an empty row then give me a 0 so at least i get something back I am filling a dataset here and it isnt populating the fields when an empty row is returned.SELECT 3 row_id, '2003' year, 'Mar' period, (SELECT count(*) FROM news WHERE news.id IN ( SELECT news.id FROM news WHERE news.announced_date >= '2003-03-01' AND ........So ive tried variations of the below in a CASE statement WHEN NUll or WHEN 0 but i still get nothing back. I would like the information to return 3 2003 Mar 0 if its empty.SELECT 3 row_id, '2003' year, 'Mar' period, (SELECT CASE count(*) WHEN NULL THEN 0 ELSE count(*) END FROM news WHERE news.id IN ( SELECT news.id FROM news WHERE news.announced_date >= '2003-03-01' AND ............Can anyone help me please?? |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2008-06-11 : 11:35:55
|
| Can you show some sample data nad explain what you want out of them? Very difficult to tell from partial query what you need to modify |
 |
|
|
madhivanan
Premature Yak Congratulator
22864 Posts |
Posted - 2008-06-11 : 11:39:43
|
| count(*) wont return NULLselect count(*) where 1=0MadhivananFailing to plan is Planning to fail |
 |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2008-06-11 : 11:45:07
|
quote: Originally posted by madhivanan count(*) wont return NULLselect count(*) where 1=0MadhivananFailing to plan is Planning to fail
i guess OP doesnt have data in table for some dates and is asking for values to be returned for missing dates as 0. probably he needs a date table with which he could join onto the current query to get missing dates. |
 |
|
|
johnnybutler7
Starting Member
16 Posts |
Posted - 2008-06-13 : 04:56:38
|
| I was expecting to be emailed when there was a response, sorry for the late reply. Here is the full sql for the query, basically there are no news items in the database for March so what i want returned is the below, at the moment im getting nothing.3 2003 Mar 0 SELECT 3 row_id, '2003' year, 'Mar' period, (SELECT COUNT(*)FROM news WHERE news.id IN ( SELECT news.id FROM news WHERE news.announced_date >= '2003-03-01' AND news.announced_date <= '2003-03-31' AND news.id IN (SELECT news.id FROM news INNER JOIN news_targets ON news_targets.news_id = news.id INNER JOIN company_countries target_company_countries ON news_targets.company_id = target_company_countries.company_idINNER JOIN countries target_countries ON target_company_countries.country_id = target_countries.idINNER JOIN regions target_regions ON target_countries.region_id = target_regions.idINNER JOIN areas target_areas ON target_regions.area_id = target_areas.idINNER JOIN company_sectors target_sectors ON news_targets.company_id = target_sectors.company_id WHERE target_countries.id IN (65) AND target_sectors.sector_id IN (197) AND news_status_id <> 4) )) total FROM news WHERE news.id IN ( SELECT DISTINCT news.id FROM news WHERE news.announced_date >= '2003-03-01' AND news.announced_date <= '2003-03-31' AND news.value IS NOT NULL AND news.id IN (SELECT news.id FROM news INNER JOIN news_targets ON news_targets.news_id = news.id INNER JOIN company_countries target_company_countries ON news_targets.company_id = target_company_countries.company_idINNER JOIN countries target_countries ON target_company_countries.country_id = target_countries.idINNER JOIN regions target_regions ON target_countries.region_id = target_regions.idINNER JOIN areas target_areas ON target_regions.area_id = target_areas.idINNER JOIN company_sectors target_sectors ON news_targets.company_id = target_sectors.company_id WHERE target_countries.id IN (65) AND target_sectors.sector_id IN (197) AND news_status_id <> 4) ) |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2008-06-13 : 05:11:03
|
Avoid correlated subqueries if you can.Denormalized querySELECT DATEPART(YEAR, news.announced_date) AS theYear, SUM(CASE WHEN DATEPART(MONTH, news.announced_date) = 1 THEN 1 ELSE 0 END) AS [Jan], SUM(CASE WHEN DATEPART(MONTH, news.announced_date) = 2 THEN 1 ELSE 0 END) AS [Feb], SUM(CASE WHEN DATEPART(MONTH, news.announced_date) = 3 THEN 1 ELSE 0 END) AS [Mar], SUM(CASE WHEN DATEPART(MONTH, news.announced_date) = 4 THEN 1 ELSE 0 END) AS [Apr], SUM(CASE WHEN DATEPART(MONTH, news.announced_date) = 5 THEN 1 ELSE 0 END) AS [May], SUM(CASE WHEN DATEPART(MONTH, news.announced_date) = 6 THEN 1 ELSE 0 END) AS [Jun], SUM(CASE WHEN DATEPART(MONTH, news.announced_date) = 7 THEN 1 ELSE 0 END) AS [Jul], SUM(CASE WHEN DATEPART(MONTH, news.announced_date) = 8 THEN 1 ELSE 0 END) AS [Aug], SUM(CASE WHEN DATEPART(MONTH, news.announced_date) = 9 THEN 1 ELSE 0 END) AS [Sep], SUM(CASE WHEN DATEPART(MONTH, news.announced_date) = 10 THEN 1 ELSE 0 END) AS [Oct], SUM(CASE WHEN DATEPART(MONTH, news.announced_date) = 11 THEN 1 ELSE 0 END) AS [Nov], SUM(CASE WHEN DATEPART(MONTH, news.announced_date) = 12 THEN 1 ELSE 0 END) AS [Dec]FROM newsINNER JOIN news_targets ON news_targets.news_id = news.idINNER JOIN company_countries ON company_countries.company_id = news_targets.company_idINNER JOIN countries ON countries.id = company_countries.country_idINNER JOIN regions ON regions.id = countries.region_idINNER JOIN areas ON areas.id = regions.area_idINNER JOIN company_sectors ON company_sectors.company_id = news_targets.company_idWHERE news.announced_date >= '2003-01-01' AND news.announced_date < '2005-01-01' AND countries.id = 65 AND company_sectors.sector_id = 197 AND news_status_id <> 4ORDER BY DATEPART(YEAR, news.announced_date) Normalized querySELECT DATEPART(YEAR, news.announced_date) AS theYear, DATEPART(MONTH, news.announced_date) AS theMonth, COUNT(*) AS TotalFROM newsINNER JOIN news_targets ON news_targets.news_id = news.idINNER JOIN company_countries ON company_countries.company_id = news_targets.company_idINNER JOIN countries ON countries.id = company_countries.country_idINNER JOIN regions ON regions.id = countries.region_idINNER JOIN areas ON areas.id = regions.area_idINNER JOIN company_sectors ON company_sectors.company_id = news_targets.company_idWHERE news.announced_date >= '2003-01-01' AND news.announced_date < '2004-01-01' AND countries.id = 65 AND company_sectors.sector_id = 197 AND news_status_id <> 4ORDER BY DATEPART(YEAR, news.announced_date), DATEPART(MONTH, news.announced_date) E 12°55'05.25"N 56°04'39.16" |
 |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2008-06-13 : 05:17:57
|
May be this:-SELECT 3 row_id,'2003' year,'Mar' period,(SELECT COUNT(*)FROM news WHERE news.id IN (SELECT news.idFROM (SELECT '2003' as Year,'Mar' AS Period)mainLEFT JOIN newsON main.Year=YEAR(news.announced_date)AND main.Period= LEFT(DATENAME(mm,news.announced_date),3)WHERE news.id IN (SELECT news.id FROM newsINNER JOIN news_targets ON news_targets.news_id = news.idINNER JOIN company_countries target_company_countries ON news_targets.company_id = target_company_countries.company_idINNER JOIN countries target_countries ON target_company_countries.country_id = target_countries.idINNER JOIN regions target_regions ON target_countries.region_id = target_regions.idINNER JOIN areas target_areas ON target_regions.area_id = target_areas.idINNER JOIN company_sectors target_sectors ON news_targets.company_id = target_sectors.company_idWHERE target_countries.id IN (65) AND target_sectors.sector_id IN (197) AND news_status_id <> 4)))totalFROM (SELECT '2003' as Year,'Mar' AS Period)mainLEFT JOIN newsON main.Year=YEAR(news.announced_date)AND main.Period= LEFT(DATENAME(mm,news.announced_date),3)WHERE news.id IN (SELECT DISTINCT news.idFROM newsWHERE news.announced_date >= '2003-03-01' AND news.announced_date <= '2003-03-31' AND news.value IS NOT NULL AND news.id IN (SELECT news.id FROM newsINNER JOIN news_targets ON news_targets.news_id = news.idINNER JOIN company_countries target_company_countries ON news_targets.company_id = target_company_countries.company_idINNER JOIN countries target_countries ON target_company_countries.country_id = target_countries.idINNER JOIN regions target_regions ON target_countries.region_id = target_regions.idINNER JOIN areas target_areas ON target_regions.area_id = target_areas.idINNER JOIN company_sectors target_sectors ON news_targets.company_id = target_sectors.company_idWHERE target_countries.id IN (65) AND target_sectors.sector_id IN (197) AND news_status_id <> 4))OR news.id IS NULL |
 |
|
|
johnnybutler7
Starting Member
16 Posts |
Posted - 2008-06-13 : 05:20:07
|
| What if i cant in this situation, is there anyway in the current SQL i posted to get an empty row to return a 0 or null?? |
 |
|
|
johnnybutler7
Starting Member
16 Posts |
Posted - 2008-06-13 : 05:31:03
|
quote: Originally posted by visakh16 May be this:-SELECT 3 row_id,'2003' year,'Mar' period,(SELECT COUNT(*)FROM news WHERE news.id IN (SELECT news.idFROM (SELECT '2003' as Year,'Mar' AS Period)mainLEFT JOIN newsON main.Year=YEAR(news.announced_date)AND main.Period= LEFT(DATENAME(mm,news.announced_date),3)WHERE news.id IN (SELECT news.id FROM newsINNER JOIN news_targets ON news_targets.news_id = news.idINNER JOIN company_countries target_company_countries ON news_targets.company_id = target_company_countries.company_idINNER JOIN countries target_countries ON target_company_countries.country_id = target_countries.idINNER JOIN regions target_regions ON target_countries.region_id = target_regions.idINNER JOIN areas target_areas ON target_regions.area_id = target_areas.idINNER JOIN company_sectors target_sectors ON news_targets.company_id = target_sectors.company_idWHERE target_countries.id IN (65) AND target_sectors.sector_id IN (197) AND news_status_id <> 4)))totalFROM (SELECT '2003' as Year,'Mar' AS Period)mainLEFT JOIN newsON main.Year=YEAR(news.announced_date)AND main.Period= LEFT(DATENAME(mm,news.announced_date),3)WHERE news.id IN (SELECT DISTINCT news.idFROM newsWHERE news.announced_date >= '2003-03-01' AND news.announced_date <= '2003-03-31' AND news.value IS NOT NULL AND news.id IN (SELECT news.id FROM newsINNER JOIN news_targets ON news_targets.news_id = news.idINNER JOIN company_countries target_company_countries ON news_targets.company_id = target_company_countries.company_idINNER JOIN countries target_countries ON target_company_countries.country_id = target_countries.idINNER JOIN regions target_regions ON target_countries.region_id = target_regions.idINNER JOIN areas target_areas ON target_regions.area_id = target_areas.idINNER JOIN company_sectors target_sectors ON news_targets.company_id = target_sectors.company_idWHERE target_countries.id IN (65) AND target_sectors.sector_id IN (197) AND news_status_id <> 4))OR news.id IS NULL
Thanks for this but it returns an empty row too.JB |
 |
|
|
|
|
|
|
|