Эквивалент SQL, когда PIVOT недоступен в SQL Server CE

У меня проблема с SQL-запросом, который выполняется правильно, за исключением Microsoft SQL Server CE (без поддержки PIVOT). Запрос следующий:

SELECT 
    *, [1] as IMGN1, [2] as IMGN2, [3] as IMGN3,
    [4] as IMGN4, [5] as IMGN5, [6] as IMGN6,
    [7] as IMGN7, [8] as IMGN8, [9] as IMGN9, 
    [10] as IMGN10 
FROM
    (SELECT 
         area.CoilId as CID, area.DEFECTID,
         (SELECT SUM(s2.endposmd - s2.startposmd) 
          FROM sections s2 
          WHERE s2.OutCoilID = 999999 
            AND s2.InCoilId <= area.coilid) AS POSITIONMD, 
         d1.DNO as CAMERADEFECTNO, d1.IMAGE_NO as IMAGE_NO,
         area.MERGEDTO as MERGEDTO
     FROM 
         (OutCoils AS oc
     INNER JOIN 
         sections AS s ON oc.OutCoilId = s.OutCoilId
     INNER JOIN 
         defects AS area ON area.coilid = s.InCoilId  
                         AND area.PositionMD >= s.StartPosMD 
                         AND area.PositionMD <= s.EndPosMD
     INNER JOIN 
         defects AS d1 ON d1.CoilId = area.CoilId 
                       AND d1.MergedTo = area.DEFECTID)   
     WHERE 
         oc.OutCoilID = 999999 AND area.MergedTo = -2) AS SourceTable 
PIVOT
    (MIN([CAMERADEFECTNO]) FOR [IMAGE_NO]
          IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10])
    ) AS PivotTable 
ORDER BY 
    PositionMD;

Как это можно преобразовать в действительный запрос SQL для выпусков, отличных от PIVOT?

Я пробовал кое-что с использованием CASE, но у меня возникла проблема с подзапросом внутри агрегатной функции, которую я использую для получения POSITIONMD, остальное уже работает нормально. Любая идея о том, как получить POSITIONMD?

SELECT 
area.DEFECTID as DEFECTID, 
min(CASE when d1.MERGEDTO = area.DEFECTID then area.COILID end) CID,
min(CASE when d1.MERGEDTO = area.DEFECTID then area.MERGEDTO end) MERGEDTO,
min(CASE when d1.MERGEDTO = area.DEFECTID then (select sum(s2.endposmd - s2.startposmd) from sections s2 where s2.OutCoilID=999999 and s2.InCoilId<=area.coilid) end) POSITIONMD,
sum(CASE when d1.IMAGE_NO = 1 then (d1.DNO) end) IMGN1,
sum(CASE when d1.IMAGE_NO = 2 then (d1.DNO) end) IMGN2,
sum(CASE when d1.IMAGE_NO = 3 then (d1.DNO) end) IMGN3,
sum(CASE when d1.IMAGE_NO = 4 then (d1.DNO) end) IMGN4,
sum(CASE when d1.IMAGE_NO = 5 then (d1.DNO) end) IMGN5,
sum(CASE when d1.IMAGE_NO = 6 then (d1.DNO) end) IMGN6,
sum(CASE when d1.IMAGE_NO = 7 then (d1.DNO) end) IMGN7,
sum(CASE when d1.IMAGE_NO = 8 then (d1.DNO) end) IMGN8,
sum(CASE when d1.IMAGE_NO = 9 then (d1.DNO) end) IMGN9,
sum(CASE when d1.IMAGE_NO = 10 then (d1.DNO) end) IMGN10
FROM ( steinb.OutCoils AS oc
INNER JOIN steinb.sections AS s ON oc.OutCoilId=s.OutCoilId
INNER JOIN steinb.defects AS area ON area.coilid=s.InCoilId  AND area.PositionMD>=s.StartPosMD AND area.PositionMD<=s.EndPosMD
INNER JOIN steinb.defects AS d1 ON d1.CoilId=area.CoilId AND d1.MergedTo=area.DEFECTID AND d1.IMAGE_NO!=0)  
WHERE oc.OutCoilID=999999 GROUP BY area.DEFECTID ORDER BY PositionMD;

Большое спасибо.

Разве вы не можете упростить свой вопрос, обрабатывая только одно поле? Или необходимо, чтобы ответ сделал всю работу за вас?

James 01.03.2019 18:36

@ Хайме, ты хочешь, чтобы спрашивающий дал тебе информацию меньше?

Russell Fox 01.03.2019 19:37

@RussellFox, да, именно об этом я и спрашиваю. Чем проще вопрос, тем проще ответ. Как вы думаете, нужно ли включать 10 случаев, когда? Не достаточно с 2 для того, чтобы спросить?

James 02.03.2019 15:29

Прямо сейчас единственная проблема заключается в том, что CASE выдает POSiTIONMD в качестве вывода. Как можно запустить подзапрос внутри, чтобы получить то же самое? Спасибо.

sevento 02.03.2019 17:16

@Jaime, есть способ профессионально побудить новых участников задавать более правильные вопросы.

Russell Fox 06.03.2019 00:05
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
5
103
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попался. Я считаю, что вам просто нужно удалить MIN:

SELECT 
    DEFECTID = area.DEFECTID
    , CID = MIN(CASE when d1.MERGEDTO = area.DEFECTID then area.COILID end) 
    , MERGEDTO = MIN(CASE when d1.MERGEDTO = area.DEFECTID then area.MERGEDTO end) 
    , POSITIONMD = CASE when d1.MERGEDTO = area.DEFECTID then (select sum(s2.endposmd - s2.startposmd) from sections s2 where s2.OutCoilID=999999 and s2.InCoilId<=area.coilid) END
    , IMGN1 = sum(CASE when d1.IMAGE_NO = 1 then (d1.DNO) END)
    , IMGN2 = sum(CASE when d1.IMAGE_NO = 2 then (d1.DNO) end)
    , IMGN3 = sum(CASE when d1.IMAGE_NO = 3 then (d1.DNO) end)
    , IMGN4 = sum(CASE when d1.IMAGE_NO = 4 then (d1.DNO) end)
    , IMGN5 = sum(CASE when d1.IMAGE_NO = 5 then (d1.DNO) end)
    , IMGN6 = sum(CASE when d1.IMAGE_NO = 6 then (d1.DNO) end)
    , IMGN7 = sum(CASE when d1.IMAGE_NO = 7 then (d1.DNO) end)
    , IMGN8 = sum(CASE when d1.IMAGE_NO = 8 then (d1.DNO) end)
    , IMGN9 = sum(CASE when d1.IMAGE_NO = 9 then (d1.DNO) end)
    , IMGN10 = sum(CASE when d1.IMAGE_NO = 10 then (d1.DNO) end)
FROM ( steinb.OutCoils AS oc
    INNER JOIN steinb.sections AS s ON oc.OutCoilId=s.OutCoilId
    INNER JOIN steinb.defects AS area ON area.coilid=s.InCoilId  AND area.PositionMD>=s.StartPosMD AND area.PositionMD<=s.EndPosMD
    INNER JOIN steinb.defects AS d1 ON d1.CoilId=area.CoilId AND d1.MergedTo=area.DEFECTID AND d1.IMAGE_NO!=0)  
WHERE oc.OutCoilID=999999 GROUP BY area.DEFECTID ORDER BY PositionMD;

Прежде всего спасибо за ответ. Основная проблема, с которой я столкнулся при реализации CASE, — это подзапрос, который я должен выполнить внутри MIN() для получения POSITIONMD. Остальная часть запроса уже работает хорошо. Что я могу сделать, чтобы получить POSITIONMD?

sevento 01.03.2019 20:25

«Невозможно выполнить агрегатную функцию для выражения, содержащего агрегат или подзапрос». Это ошибка, которую я получаю.

sevento 01.03.2019 21:26

Проблема в том, что, удалив MIN, я получил другую ошибку, потому что я использую GROUP BY в конце, и я не говорю, как обрабатывать разные значения POSITIONMD. Вот почему я использую MIN также для CID и MERGEDTO. Любой другой вариант для этого запроса внутри MIN? Спасибо.

sevento 02.03.2019 11:01

У меня небольшие проблемы с пониманием того, как выглядят ваши данные, особенно с теми соединениями, где используются "< = " и "> = ", а не просто " = ". Есть ли несколько [дефектов] на OutCoils? Вы просто хотите самое последнее?

Russell Fox 06.03.2019 00:26

Наконец, было решено удалить MIN() и добавить в предложение GROUP BY некоторые поля, используемые подзапросом для получения POSITIONMD. Спасибо за ваше время и усилия.

sevento 10.03.2019 00:17

Другие вопросы по теме