ВЫБЕРИТЕ данные, сгруппированные по НЕДЕЛЯМ в SQL - PullRequest
0 голосов
/ 26 мая 2020

У меня есть рабочий запрос (ORACLE SQL), который дает мне галлоны, сгруппированные по номеру магазина, с суммированием галлонов по типу и процентному столбцу. У каждого номера магазина своя дата конверсии, с которой я суммирую данные -

SELECT StoreNbr, 
SUM(CASE WHEN(ClrntSys IN ('844', '84448')) THEN Gallons ELSE 0 END) AS Gallons_844,
SUM(CASE WHEN(ClrntSys ='GIC') THEN Gallons ELSE 0 END) AS Gallons_GIC,
SUM(CASE WHEN(ClrntSys IN ('844', '84448', 'GIC')) THEN Gallons ELSE 0 END) AS Total_Gallons,
CONCAT(CAST((SUM(CASE WHEN(ClrntSys ='GIC') THEN Gallons ELSE 0 END) /
SUM(CASE WHEN(ClrntSys IN ('844', '84448', 'GIC')) THEN Gallons ELSE 0 END)) AS DECIMAL (5,2)) * 100, '%') AS Percent_GIC
FROM MQ_CDS_NETTRAN
WHERE ClrntSys IN ('844', '84448', 'GIC')
AND ((CostCenter = '701104' AND LastTranDate >= DATE '2020-03-10') 
OR (CostCenter = '701109' AND LastTranDate >= DATE '2020-03-04')
OR (CostCenter = '701257' AND LastTranDate >= DATE '2020-03-12'))
GROUP BY StoreNbr
ORDER BY StoreNbr;

Теперь мне нужно также суммировать по неделям, при этом воскресенье является первым днем ​​каждой недели, но я не понимаете, как работает DATEPART. Чтобы получить лучшее представление, я попытался только суммировать данные за прошлую неделю, используя примеры DATEPART, которые я вижу в Интернете, но это не сработало. Это дает мне "недействительный идентификатор DATEPART". -

SELECT DATEPART(week, 5/17/20) AS weekTotal, 
StoreNbr, 
SUM(CASE WHEN(ClrntSys IN ('844', '84448')) THEN Gallons ELSE 0 END) AS Gallons_844,
SUM(CASE WHEN(ClrntSys ='GIC') THEN Gallons ELSE 0 END) AS Gallons_GIC,
SUM(CASE WHEN(ClrntSys IN ('844', '84448', 'GIC')) THEN Gallons ELSE 0 END) AS Total_Gallons,
CONCAT(CAST((SUM(CASE WHEN(ClrntSys ='GIC') THEN Gallons ELSE 0 END) /
SUM(CASE WHEN(ClrntSys IN ('844', '84448', 'GIC')) THEN Gallons ELSE 0 END)) AS DECIMAL (5,2)) * 100, '%') AS Percent_GIC
FROM MQ_CDS_NETTRAN
WHERE ((CostCenter = '701104' AND LastTranDate >= DATE '2020-03-10') 
OR (CostCenter = '701109' AND LastTranDate >= DATE '2020-03-04')
OR (CostCenter = '701257' AND LastTranDate >= DATE '2020-03-12'))
GROUP BY DATEPART(week, 5/17/20), StoreNbr
ORDER BY StoreNbr;

Что мне действительно нужно, так это данные за каждую неделю (с воскресеньем, являющимся началом каждой недели), суммированные отдельно, начиная с даты конверсии каждого магазина. Возможно ли это? Есть ли что-нибудь еще, кроме DATEPART, что бы лучше работало?

1 Ответ

1 голос
/ 26 мая 2020

Извините - только что заметил, что вы сказали Oracle SQL, и мой первый ответ был для SQL сервера! Причина, по которой вы получаете сообщение об ошибке, заключается в том, что DATEPART не является функцией Oracle. Вместо этого вы можете просто вычислить даты, используя известное воскресенье (до известной первой даты в таблице БД) в качестве даты привязки:

SELECT
    '30-DEC-2018' as "Known Sunday,
    trunc((sysdate - to_date('30-DEC-2018')) / 7) as "Week Num",
    to_date('30-DEC-2018') 
        + (trunc((sysdate - to_date('30-DEC-2018')) / 7) * 7)"
FROM
    dual
...