2013-04-28 3 views
1

Я полностью новичок в SQL, и я работаю над созданием фида данных из программного обеспечения для точки продажи для анализа сторонних производителей. Ниже приведены требования к CSV, которые будут загружены на канал данных:Включая результаты NULL как Zero при использовании COUNT и SUM

Файл .CSV должен содержать строки со следующими значениями: в Магазине ID указывает уникальный идентификатор магазина (т.е. store1), и должен укажите название своей цепочки (в том же формате, что и имя файла), и конкретный номер магазина. Это не должно содержать пробелов или знаков препинания до или после запятой.

-The ДАТА в формате/ДД/ГГГГ ММ

-hh соответствует соответствующему час, используя 24-часовые часы (0-23, где 0 указывает на полуночи до 1 AM).

-Значение COUNT - это количество транзакций за этот конкретный час работы, как определено в предыдущем разделе.

- Значение SALES DOLLARS соответствует общему объему продаж, накопленному за этот час, как определено в предыдущем разделе. Обратите внимание, что запятые не могут использоваться в качестве разделителей тысяч или символов знака доллара.

-TRAFFIC PLACEHOLDER - обязательное поле, но оно должно быть оставлено как значение 0.

Пример вывода

Wxyz434,02/28/2011,13,56,446.34,0

Wxyz434,02/28/2011,14,61,482.28,0

Wxyz434,02/28/2011,15,63,382.80,0

Я был в состоянии определить местонахождение тыс е таблицы в рамках программы экспортирования данных в пределах моего POS программного обеспечения, и я использовали этот SQL-запрос:

/***** Script for Headcount Data *****/ 
select [STR_ID] 
    ,[BUS_DAT] 
    ,[TKT_TIM_HR] 
       ,COUNT ([TKT_NO]) 
    ,SUM ([SAL_TOT]) 

from MyData.dbo.VI_PS_TKT_HIST 
where BUS_DAT between '04-24-2013 00:00:00' and '04-24-2013 11:59:59' and 
TKT_TIM_HR between '10' and '19' 

group by BUS_DAT, STR_ID, TKT_TIM_HR 

С частичными результатами:

"STR_ID", "BUS_DAT", "TKT_TIM_HR " "поле", "Field_1"

"1", "4/24/2013 12: 00: 00,000 AM", 19,1,270.27

"11"," 4/24/2013 12: 00: 00.000 AM ", 10,1,32.95

"11", "4/24/2013 12: 00: 00,000 AM", 12,4,229.24

"11", "4/24/2013 12: 00: 00,000 AM", 13,1,137.28

Вы заметите, что TKT_TIM_HR является чАС, что билет будет обработан, и не было билетов, обработанные в 11 час.

Как изменить запрос, чтобы строка существовала в течение 11 часов, даже если нет билетов/номеров продаж?(Count NULL в ноль ??)

Большое спасибо за любую помощь ,,

Тайлер

+0

FYI, что вы пытаетесь достичь, называется 'пробелы заполнения в разреженной data' и, как правило, лучше всего сделать с помощью' секционированной внешней join' к таблице (или запросу), в которой перечислены комбинации «каждый день/час» в том диапазоне, который вам нужен. Какие СУБД вы используете? Это 'mysql',' oracle', 'sqlite' и т. Д.? –

+0

Обратите внимание, что если 'partitioned external join' недоступен, вы можете использовать' left external join' в своей таблице дат и часов. –

+0

Спасибо Томми. У меня есть доступ к SQL Server Studio 2008 R2, однако сценарий используется для генерации экспорта данных из самого ПО POS (Counterpoint SQL). –

ответ

0

Самый простой способ, если он доступен для вас, чтобы настроить колонку, чтобы не позволить аннулирует и иметь значение по умолчанию 0.

+0

Спасибо Dan. К сожалению, я не могу изменить базу данных самостоятельно, только запросить ее. Кроме того, нет другой таблицы, которая включает TKT_TIM_HR, так что использование LEFT JOIN будет проблематичным? –

+0

Левое соединение не будет проблематичным. –

+0

Еще раз спасибо, Дэн. У меня возникли проблемы с поиском информации об использовании левого соединения в уже выбранном столбце. Если я удалю его из первого запроса, добавьте ли я левое соединение в качестве второго SELECT TKT_TIM_HR FROM MYDATA.dbo.VI_PS_TKT_HIST? Приносим извинения, если есть ответ, который можно найти в другом месте, я три дня занимаюсь исследованиями, и мой мозг немного поджарен. –

0

Вам нужно будет создать отношение «календарь» для использования в качестве подзапроса, который может быть LHS LEFT OUTER JOIN. Если вам необходимо сообщить в час только, что-то, как это будет делать:

select [Hour], AmPm 
from (
    select Hour= 1 union all select 2 union all select 3 union all select 4 union all 
    select Hour= 5 union all select 6 union all select 7 union all select 8 union all 
    select Hour= 9 union all select 10 union all select 11 union all select 12 
) H 
cross join (select AmPm = 'am' union all select 'pm' 
) T 
order by AmPm,[Hour] 
+0

Спасибо, Питер, я попробую это. Если Hour - двухзначный 24-часовой формат, я просто продолжаю объединение, все выбирают, пока не будут созданы все 24? –

+0

Или, в этом случае вы можете просто хотеть (a) изменить AmPm на a * 2; и (b) изменить 1 на 12, чтобы стать от 0 до 11; дать себе часы от 0 до 23 с немного меньшей многословностью. Если вы снова используете его, создайте его как таблицу в своей БД. Лучшее спасибо, конечно, за голосование или принятие. –

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