SQL получить различное количество клиентов по часам - PullRequest
0 голосов
/ 30 марта 2020

У меня есть две таблицы с datein и timein, которые записываются при размещении заказа, и другая таблица с столбцом datepicked и timepicked, которая записывается при получении счета из заказа. Мне нужно выяснить, сколько клиентов у меня каждый час, но некоторые размещают заказ, некоторые получают счета, а некоторые делают и то, и другое. Может быть более одного заказа и счета для одного и того же клиента в один и тот же день / час.

OrderTable:
Ordernum
CustomerID
datein
timein

InvoiceTable:
CustomerID
InvoiceID
Ordernum
datepicked
timepicked 

Я пробовал это SQL, но не могу узнать, как получить ОТЛИЧНОГО ПОЛЬЗОВАТЕЛЯ от Обе таблицы, а также дата и часы выстроились в обе таблицы, в результате я заметил, что в случае отсутствия заказа на один час / день столбцы не выстраивались в очередь.

Select o.datein, i.datepicked, (o.datein) As iDay, HOUR(o.timein) as iH,
DayOfMonth(i.datepicked) As pDay, HOUR(i.timepicked) as pH, Count(*) as Total
from OrderTable o, InvoiceTable i
Where
o.datein >= '2019-01-01' and o.datein <= '2019-12-31'
GROUP BY o.datein, i.datepicked, iDay, iH, pDay, pH

Спасибо за любую помощь. Ким

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Не уверен, почему таблицы настроены так, как они есть, но если все, что вас действительно волнует, это клиент DISTINCT за дату / час, я бы сделал следующее, предварительно объединив только эти записи, а затем подсчитав их отдельно. Не беспокойтесь о присоединении, если транзакции выполнялись в разное время, если только вы не считаете, что заказ и счет-фактуры ОБА обрабатываются в течение одного часа. Что произойдет, если один заказ будет сделан в 10:59, а счет будет выставлен в 11:00 с интервалом всего в 1 минуту, но представляет 2 разных часа. В каждом отдельном часовом компоненте будет отображаться один и тот же клиент.

Обратите внимание, что в первом предложении «FROM» есть объединение для получения всех записей в одном и том же массиве имен столбцов, каждый из которых имеет свои соответствующие 2019 дата календарной активности. Как только это будет сделано, получите и сгруппируйте для клиентов COUNT DISTINCT.

select
        AllRecs.DateIn,
        hour( AllRecs.TimeIn ) ByHour,
        DayOfMonth(AllRecs.DateIn) pDay, 
        Count( distinct AllRecs.CustomerID ) UniqueCustomers
    from
    ( select 
            ot.CustomerID, 
            ot.datein, 
            ot.timein
        from 
            OrderTable ot
        where
                ot.datein >= '2019-01-01' 
            and ot.datein <= '2019-12-31'
      union all
      select 
            it.CustomerID, 
            it.datepicked datein, 
            it.timepicked timein
        from 
            InvoiceTable it
        where
                it.datepicked >= '2019-01-01' 
            and it.datepicked <= '2019-12-31' ) AllRecs
    group by
        AllRecs.DateIn,
        hour( AllRecs.TimeIn ),
        DayOfMonth(AllRecs.DateIn)
0 голосов
/ 02 апреля 2020

Если бы у вас была связь между этими двумя таблицами, это было бы возможно. Если я понимаю, что вы пытаетесь сделать, InvoiceTable должна быть дочерней таблицей OrderTable с полем внешнего ключа «OrderNum», которое связано с его родительским первичным ключом «OrderTable» «OrderNum». Следовательно, вам не нужно поле «CusotmerID» в InvoiceTable, и вы будете знать, когда полученный счет относится к заказу в тот же день.

...