Мы можем попробовать использовать ROW_NUMBER
, чтобы помочь здесь. Например, для трех полных столбцов мы можем попробовать:
WITH cte AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY storenum, busidate, gcode
ORDER BY cid) rn
FROM #temporarytable
)
SELECT
storenum,
busidate,
gcode,
MAX(CASE WHEN rn = 1 THEN total END) AS total1,
MAX(CASE WHEN rn = 2 THEN total END) AS total2,
MAX(CASE WHEN rn = 3 THEN total END) AS total3
FROM cte
GROUP BY
storenum,
busidate,
gcode;
Предполагается, что существует столбец cid
, который определяет порядок итоговых значений.
Edit:
Если вы используете действительно старую версию SQL Server (например, 2000), которая не имеет ROW_NUMBER
, мы могли бы смоделировать ее:
WITH cte AS (
SELECT t1.*,
(SELECT COUNT(*) FROM #temporarytable t2 WHERE t2.cid <= t1.cid) rn
FROM #temporarytable t1
)
SELECT
storenum,
busidate,
gcode,
MAX(CASE WHEN rn = 1 THEN total END) AS total1,
MAX(CASE WHEN rn = 2 THEN total END) AS total2,
MAX(CASE WHEN rn = 3 THEN total END) AS total3
FROM cte
GROUP BY
storenum,
busidate,
gcode;