2013-08-01 4 views
0

Это отчет, который нужно создать в SQL ReportШесть колонн из двух колонн

3 столбцов Swing, Turnback и Inday являются типы запросов объема сделанных счетов. Они хранятся в VolumeRequest таблицы, которая хранит запрос по счету и даты начала и окончания для запросов, как показано ниже Volme Request

VolumeRequestTypeId 2 обозначает Swing, 3 для Turnback и 4 для Inday

В 3 колонны FL Gas Zn1 (GDA), FL Gas Zn2 (GDA) и FL Gas Zn3 (GDA) и индексы, которые имеют ежедневные цены (Midpoint) хранится в таблице IndexHistory, как показано ниже Index History

мне нужно, чтобы отобразить различные запросы на объем г на счетах с подотчетными лицами 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] 

, но он вернулся в приведенной ниже таблице result1

Как это не было результатом необходимости я сделал 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] 

Это возвращается к следующему результату result2

Как я была сумма объема была разбита больше, чем требуется из-за 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] 

На этот раз все было право ожидать, что что дни с вне запросов не отображаются, как показано ниже result3 я не знаю, где я неправильно. Может кто-то помочь мне с этим?

+0

Рассмотрите возможность использования влево/вправо включается вместо внутренних соединений. –

ответ

2

Начну с того, что вы сделали это невероятно тяжело, предоставив данные, которые не совпадают - первое изображение имеет данные в марте 2013 года, второе 12 июня, третье 12 июля. трудно точно определить, откуда поступают данные и как вы его применяете.

В любом случае, это то, что я придумал. Я не включил в таблицу записей (или ограничен его счет), поэтому если вы хотите использовать его, вам придется сделать несколько модификаций

;WITH Gas AS (
    SELECT FlowDate, [412] as [FL Gas Zn1 (GDA)], [463] as [FL Gas Zn2 (GDA)], [420] as [FL Gas Zn3 (GDA)] 
    FROM (
    SELECT IndexId, FlowDate, Midpoint 
    FROM IndexHistory 
) p 
    PIVOT (max(Midpoint) FOR IndexId IN ([412], [463], [420])) AS pvt 
), 
Volume AS (
    SELECT FlowDate, [Swing], [Turnback], [Inlay] 
    FROM (
    SELECT DISTINCT IH.Flowdate, VRT.Name, VR.Volume 
    FROM IndexHistory IH 
    INNER JOIN VolumeRequest VR ON IH.FlowDate BETWEEN @startdate AND '2012-06-30' AND indexid IN (412,463,420) AND VR.EndDate>= @startdate AND VR.StartDate <= '2012-06-30' 
    INNER JOIN VolumeRequestType VRT ON VR.VolumeRequestTypeId = VRT.Id 
) p 
    PIVOT (sum(Volume) FOR Name IN ([Swing], [Turnback], [Inlay])) AS pvt 
) 
SELECT G.Flowdate, Swing, Turnback, Inlay, [FL Gas Zn1 (GDA)], [FL Gas Zn2 (GDA)], [FL Gas Zn3 (GDA)] 
FROM Gas G 
INNER JOIN Volume V ON G.FlowDate = V.FlowDate 

Я широко использовал PIVOTs и CTEs для это

SQL Fiddle here

+0

Я был в спешке, чтобы покинуть свой офис, а 2-е и 3-е изображения - просто показать структуру таблиц. Я обновлю вопрос в понедельник, когда вернусь к работе.Большое спасибо за ваш ответ. Я попробую в понедельник и дам вам знать, работает ли это. – Ram

+0

Почему вы делаете 'MAX'in' PIVOT'? – Ram

+0

извините, сначала PIVOT должен быть MAX, второй должен быть SUM. Я обновлю – Beno

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