Это отчет, который нужно создать в SQL Шесть колонн из двух колонн
3 столбцов Swing
, Turnback
и Inday
являются типы запросов объема сделанных счетов. Они хранятся в VolumeRequest
таблицы, которая хранит запрос по счету и даты начала и окончания для запросов, как показано ниже
VolumeRequestTypeId
2 обозначает Swing
, 3 для Turnback
и 4 для Inday
В 3 колонны FL Gas Zn1 (GDA)
, FL Gas Zn2 (GDA)
и FL Gas Zn3 (GDA)
и индексы, которые имеют ежедневные цены (Midpoint
) хранится в таблице IndexHistory
, как показано ниже
мне нужно, чтобы отобразить различные запросы на объем г на счетах с подотчетными лицами 202 203 205 за данный месяц. Отчет должен иметь строку для каждого дня месяца, поэтому мне нужно суммировать запросы на день для каждого типа запросов объема.
Для этого я начал применять solution, который я нашел дважды для обеих таблиц как показано ниже
DECLARE @startdate DATE
SET @startdate = '03/01/2013'
SELECT DISTINCT IH.Flowdate AS [Date],
CASE WHEN VR.VolumeRequestTypeId=2 AND IH.Flowdate BETWEEN VR.StartDate AND VR.EndDate THEN SUM(VR.Volume) END AS Swing,
CASE WHEN VR.VolumeRequestTypeId=3 AND IH.Flowdate BETWEEN VR.StartDate AND VR.EndDate THEN SUM(VR.Volume) END AS Turnback,
CASE WHEN VR.VolumeRequestTypeId=4 AND IH.Flowdate BETWEEN VR.StartDate AND VR.EndDate THEN SUM(VR.Volume) END AS Inday,
CASE WHEN IH.Indexid=412 THEN IH.Midpoint END AS [FL Gas Zn1 (GDA)],
CASE WHEN IH.Indexid=420 THEN IH.Midpoint END AS [FL Gas Zn2 (GDA)],
CASE WHEN IH.Indexid=463 THEN IH.Midpoint END AS [FL Gas Zn3 (GDA)]
FROM IndexHistory IH
LEFT JOIN VolumeRequest VR
ON IH.FlowDate BETWEEN @startdate AND EOMONTH(@startdate,0) AND indexid in (412,463,420) AND VR.EndDate>= @startdate AND VR.StartDate <= EOMONTH(@startdate,0)
INNER JOIN Account A
ON A.Id=VR.accountId
INNER JOIN VolumeRequestType VRT
ON VR.VolumeRequestTypeId=VRT.Id
WHERE VRT.Id in (2,3,4) AND ISNULL(VR.Deprecated,0)<>1 AND A.Id in (202,203,205) AND ISNULL(A.Status,'open')<>'closed'
GROUP BY VR.VolumeRequestTypeId, IH.Flowdate, VR.Volume, IH.Indexid, IH.Midpoint,VR.StartDate,VR.EndDate
ORDER BY [Date]
, но он вернулся в приведенной ниже таблице
Как это не было результатом необходимости я сделал 3 присоединяется к IndexHistory
для трех индексов, как показано ниже
DECLARE @startdate DATE
SET @startdate = '03/01/2013'
SELECT DISTINCT IH1.Flowdate AS [Date],
CASE WHEN VR.VolumeRequestTypeId=2 AND IH1.Flowdate BETWEEN VR.StartDate AND VR.EndDate THEN SUM(VR.Volume) END AS Swing,
CASE WHEN VR.VolumeRequestTypeId=3 AND IH1.Flowdate BETWEEN VR.StartDate AND VR.EndDate THEN SUM(VR.Volume) END AS Turnback,
CASE WHEN VR.VolumeRequestTypeId=4 AND IH1.Flowdate BETWEEN VR.StartDate AND VR.EndDate THEN SUM(VR.Volume) END AS Inday,
IH1.Midpoint AS [FL Gas Zn1 (GDA)],
IH2.Midpoint AS [FL Gas Zn2 (GDA)],
IH3.Midpoint AS [FL Gas Zn3 (GDA)]
FROM IndexHistory IH1
LEFT JOIN VolumeRequest VR ON IH1.FlowDate BETWEEN @startdate AND EOMONTH(@startdate,0) AND IH1.indexid = 412 AND VR.EndDate>= @startdate AND VR.StartDate <= EOMONTH(@startdate,0)
INNER JOIN IndexHistory IH2 ON IH2.FlowDate = IH1.FlowDate AND IH2.indexid = 420
INNER JOIN IndexHistory IH3 ON IH3.FlowDate = IH1.FlowDate AND IH3.indexid = 463
INNER JOIN Account A ON A.Id=VR.accountId
INNER JOIN VolumeRequestType VRT ON VR.VolumeRequestTypeId=VRT.Id
WHERE VRT.Id in (2,3,4) AND ISNULL(VR.Deprecated,0)<>1 AND A.Id in (202,203,205) AND ISNULL(A.Status,'open')<>'closed'
GROUP BY VR.VolumeRequestTypeId, IH1.Flowdate, VR.Volume, IH1.Midpoint,IH2.Midpoint, IH3.Midpoint, VR.StartDate,VR.EndDate
ORDER BY [Date]
Это возвращается к следующему результату
Как я была сумма объема была разбита больше, чем требуется из-за GROUP BY
. Я хотел попробовать `OVER» и попробовал его, как показано ниже
DECLARE @startdate DATE
SET @startdate = '03/01/2013'
SELECT DISTINCT IH1.Flowdate AS [Date],
CASE WHEN VR.VolumeRequestTypeId=2 AND IH1.Flowdate BETWEEN VR.StartDate AND VR.EndDate THEN SUM(VR.Volume) OVER (PARTITION BY IH1.Flowdate) END AS Swing,
CASE WHEN VR.VolumeRequestTypeId=3 AND IH1.Flowdate BETWEEN VR.StartDate AND VR.EndDate THEN SUM(VR.Volume) OVER (PARTITION BY IH1.Flowdate) END AS Turnback,
CASE WHEN VR.VolumeRequestTypeId=4 AND IH1.Flowdate BETWEEN VR.StartDate AND VR.EndDate THEN SUM(VR.Volume) OVER (PARTITION BY IH1.Flowdate) END AS Inday,
IH1.Midpoint AS [FL Gas Zn1 (GDA)],
IH2.Midpoint AS [FL Gas Zn2 (GDA)],
IH3.Midpoint AS [FL Gas Zn3 (GDA)]
FROM IndexHistory IH1
LEFT JOIN VolumeRequest VR ON IH1.FlowDate BETWEEN @startdate AND EOMONTH(@startdate,0) AND IH1.indexid = 412 AND VR.EndDate>= @startdate AND VR.StartDate <= EOMONTH(@startdate,0)
INNER JOIN IndexHistory IH2 ON IH2.FlowDate = IH1.FlowDate AND IH2.indexid = 420
INNER JOIN IndexHistory IH3 ON IH3.FlowDate = IH1.FlowDate AND IH3.indexid = 463
INNER JOIN Account A ON A.Id=VR.accountId
INNER JOIN VolumeRequestType VRT ON VR.VolumeRequestTypeId=VRT.Id
WHERE VRT.Id in (2,3,4) AND ISNULL(VR.Deprecated,0)<>1 AND A.Id in (202,203,205) AND ISNULL(A.Status,'open')<>'closed' AND IH1.Flowdate BETWEEN VR.StartDate AND VR.EndDate
ORDER BY [Date]
На этот раз все было право ожидать, что что дни с вне запросов не отображаются, как показано ниже я не знаю, где я неправильно. Может кто-то помочь мне с этим?
Рассмотрите возможность использования влево/вправо включается вместо внутренних соединений. –