2010-12-15 2 views
0

Я пытаюсь создать запрос в MS SQL 2005, который будет возвращать данные для 4 диапазонов дат в виде отдельных столбцов в моем наборе результатов.Использование случая для создания нескольких столбцов данных

Прямо сейчас мой запрос выглядит как запрос ниже. Он отлично работает, однако я хочу добавить дополнительные столбцы для каждого диапазона дат, поскольку он в настоящее время поддерживает один диапазон дат, когда.

Это приведет к возврату итогового1, total2, total3 и всего 4 столбца вместо одного общего столбца, такого как текущий запрос ниже. Каждая общая сумма будет представлять собой 4 диапазона дат:

Я уверен, что это может быть выполнено с использованием операторов case, но не 100%.

Любая помощь, безусловно, будет оценена.

SELECT 
     vendor,location, 
     sum(ExtPrice) as total 

    FROM [database].[dbo].[saledata] 
where processdate between '2010-11-03' and '2010-12-14' 

and location <>'' 
and vendor <> '' 

group by vendor,location with rollup 

ответ

2

Я обычно делаю это так:

SELECT 
     vendor,location, 
     sum(CASE WHEN processdate BETWEEN @date1start AND @date1end THEN xtPrice ELSE 0 END) as total, 
     sum(CASE WHEN processdate BETWEEN @date2start AND @date2end THEN xtPrice ELSE 0 END) as total2, 
     sum(CASE WHEN processdate BETWEEN @date3start AND @date3end THEN xtPrice ELSE 0 END) as total3, 
     sum(CASE WHEN processdate BETWEEN @date4start AND @date4end THEN xtPrice ELSE 0 END) as total4  
    FROM [database].[dbo].[saledata] 

and location <>'' 
and vendor <> '' 

group by vendor,location with rollup 

И вы можете изменить WHEN часть, чтобы сделать желаемые диапазоны дат.

+0

Да, спасибо, это хорошо работает. Я также пытаюсь использовать нижеприведенный подход для этого обстоятельства. – joe

0

Использование подзапросов, т.е.

select sd.vendor, sd.location, sd1.total, sd2.total, sd3.total, sd4.total 
from (select distinct vendor, location from saledata) AS sd 
LEFT JOIN (
SELECT vendor,location, sum(ExtPrice) as total 
    FROM [database].[dbo].[saledata] 
where processdate between 'startdate1' and 'enddate1' 
and location <>'' 
and vendor <> '' 
group by vendor,location with rollup) sd1 on sd1.vendor=sd.vendor and sd1.location=sd.location 

LEFT JOIN (
SELECT vendor,location, sum(ExtPrice) as total 
    FROM [database].[dbo].[saledata] 
where processdate between 'startdate2' and 'enddate2' 
and location <>'' 
and vendor <> '' 
group by vendor,location with rollup) sd2 on sd2.vendor=sd.vendor and sd2.location=sd.location 

LEFT JOIN (
SELECT vendor,location, sum(ExtPrice) as total 
    FROM [database].[dbo].[saledata] 
where processdate between 'startdate3' and 'enddate3' 
and location <>'' 
and vendor <> '' 
group by vendor,location with rollup) sd3 on sd3.vendor=sd.vendor and sd3.location=sd.location 

LEFT JOIN (
SELECT vendor,location, sum(ExtPrice) as total 
    FROM [database].[dbo].[saledata] 
where processdate between 'startdate4' and 'enddate4' 
and location <>'' 
and vendor <> '' 
group by vendor,location with rollup) sd4 on sd4.vendor=sd.vendor and sd4.location=sd.location 
+0

Могу ли я вернуть возвращаемое значение null? Я попробовал isnull, но он, похоже, не заставляет 0 – joe

+0

@joe. Я считаю, что стоимость запуска этого запроса больше, чем мой запрос. Не обижайтесь, @SteveCav. joe, попробуйте запустить оба запроса в анализаторе запросов и посмотреть время и стоимость каждого из них. – BeemerGuy

+0

Я думаю, что вы правы в отношении стоимости запроса. Я просто понял, что мне нужно извлекать данные из старой базы данных, если она ниже определенной даты, что не позволяет мне использовать ваш запрос в текущем состоянии. – joe

Смежные вопросы