Есть ли возможность отделить 2 столбца данных от группировки данных - PullRequest
0 голосов
/ 13 мая 2019

У меня есть эти данные во временной таблице:

cid | storenum |  busidate   | gcode | total |
10  |   010    | 2019-04-05  |  868  | 55456 |
127 |   010    | 2019-04-05  |  868  | 61000 |

Я хочу группировать по запросу некоторые данные, чтобы получить вывод, подобный этому

storenum | busidate   | gcode |          total 1          | total 2
   010   | 2019-04-05 |  868  | 55456 (from row cid 10)   | 61000 (from row cid 127)

Я запросил как

SELECT storenum, busidate, gcode
FROM #temporarytable
GROUP BY storenum, busidate, gcode

как поместить данные группировки в другой столбец отдельно?

Ответы [ 3 ]

0 голосов
/ 13 мая 2019

Вы можете попробовать ниже

select storenum, busidate, gcode,max(case when rn=1 then total end) as total1,
max(case when rn=2 then total end) as total2
from
(
SELECT storenum, busidate, gcode,total,
row_number() over(partition by storenum, busidate, gcode order by total) as rn
FROM #temporarytable
)A group by storenum, busidate, gcode
0 голосов
/ 13 мая 2019

Вы также можете попробовать использовать PIVOT, как показано ниже

    create table #store(
    cid int ,
    storenum nvarchar(10),
    busidate datetime,
    gcode int,
    total int
    )

   insert into #store
   values
   (10 , '010', '2019-04-05', 868, 55456),
   (11 , '010', '2019-04-05', 868, 61000),
   (12 , '010', '2019-04-05', 868, 7000)


   DECLARE @pivotCols AS NVARCHAR(MAX),
        @colsNames AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX);

   SELECT @pivotCols= ISNULL(@pivotCols + ',','') + QUOTENAME(Total)
   FROM (SELECT DISTINCT ISNULL(total, 0 ) AS Total FROM #store) AS cols


   SELECT @colsNames = ISNULL(@colsNames + ',','') + 'MAX(' + QUOTENAME(Total) + ') AS ' 
   + QUOTENAME('Total ' + CONVERT(nvarchar(10), RowNo))  
   FROM (SELECT DISTINCT ISNULL(total, 0 ) AS Total,  ROW_NUMBER() OVER(ORDER BY Total 
   ASC) AS RowNo FROM #store) AS colsNoSpaces

   set @query = 'select  storenum,  busidate,   gcode, ' + @colsNames + '
   from #store
   pivot    
   (
     max(total)
     for total in ('+ @pivotCols + ')
   ) as p group by storenum,    busidate,   gcode'

   execute (@query)
0 голосов
/ 13 мая 2019

Мы можем попробовать использовать 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...