SQL-запрос с возвращаемыми столбцами на основе группировки - PullRequest
2 голосов
/ 02 февраля 2012

У меня есть этот выбор следующим образом:

SELECT SUBSTRING(Col1, 1, 3)          AS 'Series',
       b.Col2,
       CAST(c.Price * c.Qty AS MONEY) AS Total
FROM   tableName a
inner join ....
...
WHERE  DATE BETWEEN '1/1/2012' AND '1/31/2012'
       AND B IN ( 'C50', 'C51', 'C52', 'C53', 'C54' )
GROUP  BY Col1,
          b.Col2,
          c.Price,
          c.Qty  

Что возвращает этот набор результатов:

Series       Col2        Total
----------   ----------  ----------
105          C50         5.00
105          C50         15.00
105          C53         20.00
105          C53         20.00
105          C53         20.00

И вот как я бы хотел, чтобы это работало:

Series       C50         C53
----------   ----------  ----------
105          20.00       60.00   

Не уверен, как сделать внутренний выбор, чтобы получить этот результат. Есть идеи?

Ответы [ 2 ]

1 голос
/ 02 февраля 2012

Пожалуйста, попробуйте следующие коды.Вы должны использовать запрос PIVOT.

create table TableName (Series varchar(20),col2 varchar(10), price decimal(8,2))

insert into TableName values ('105','C50',30)
insert into TableName values ('105','C50',10)

insert into TableName values ('105','C53',20)
insert into TableName values ('105','C53',30)


SELECT Series,
       [C50],
       [C53]
FROM   (SELECT Series,
               col2,
               price
        FROM   TableName) AS SourceTable 
                   PIVOT ( SUM(price) FOR col2 IN ([C50],
                                                   [C53])
       ) AS PivotTable;  
0 голосов
/ 03 февраля 2012

В качестве потенциального нулевого значения для col2, пожалуйста, попробуйте следующий код.

Примечание: вам может потребоваться настроить размер @PIV_COL в зависимости от количества различных записей col2.Я использовал 'NO_VAL' для потенциального значения NULL col2.

insert into TableName  values ('105',NULL,100)


DECLARE @PIV_COL VARCHAR(100)

SELECT @PIV_COL = STUFF(
(
    SELECT DISTINCT ',[' + ISNULL(COL2,'NO_VAL') + ']'
    FROM TableName  C   
    FOR XML PATH('')
), 1, 1, '') 


EXEC
('
    SELECT Series,' + @PIV_COL + '
    FROM   (
                SELECT Series,
                   ISNULL(COL2,''NO_VAL'') col2,
                   price
            FROM   TableName ) AS SourceTable 
                       PIVOT ( SUM(price) FOR col2 IN ('+ @PIV_COL + ')
    ) AS PivotTable
')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...