在 PIVOT 中将子值分组为一组

Grouping Subsidiary Values in one groups in PIVOT

请考虑这种情况:

我们有存储订单规格的订单 table。这些规范之一是货币。我在 table 中有几种货币,例如 美元、欧元、英镑、日元、迪拉姆、里亚尔、卢比 美元、欧元、英镑是主要货币。我想在我的查询中将其他人分组为一组。我如何使用 PIVOT 命令来做到这一点?

我想创建这样的结果:

ProductCategory        Dollar      Euro       Pound      Others
---------------------------------------------------------------
P1                     1000        2000        500        880
P2                     1200        100         200        750
P3                     1900        8000        700        640
P4                     1500        500         1000       270
P5                     2000        1700        1200       1000

谢谢


更新 1)

我的来源 table 是这样的:

ProductCategory   Currency     Amount       
----------------------------------------
P1                Dollar       100         
P2                Euro         500    
P3                Dollar       100      
P4                Yen          200       
P1                Dollar       100       
P3                Rupee        50        
...

更新 2)

declare @tbl  table
(
    Product   nvarchar(50),
    Cur       nvarchar(50),
    Amount    int
)


insert into @tbl values
('p1', 'dollar',100),
('p2', 'euro',100),
('p3', 'pound',100),
('p1', 'a',100),
('p1', 'b',100),
('p2', 'c',100),
('p3', 'dollar',100),
('p3', 'euro',100),
('p2', 'euro',100),
('p2', 'euro',100),
('p1', 'j',100)


SELECT pv.Product
    ,ISNULL(pv.Dollar,0) AS [Dollar]
    ,ISNULL(pv.Euro,0) AS [Euro]
    ,ISNULL(pv.Pound,0) AS [Pound]
    ,ISNULL(pv.Other,0) AS [Other]
FROM (
SELECT *
    ,CASE
        WHEN [Cur] NOT IN ('dollar','euro','pound') THEN 'Other'
        ELSE [Cur]
    END AS [newCurrency] 
FROM @tbl
)as a
PIVOT (
    SUM([Amount]) 
    FOR [newCurrency] IN ([dollar],[euro],[pound],[Other])
)as pv

得到这个结果:

试试这个查询,您可以根据产品对其他货币求和。

select  productCategory, 
        sum(dollar), 
        sum(euro),
        sum(pound), 
        sum(others) 
from order 
group by productCategory

希望对您有所帮助。

试试这个查询

 SELECT pv.ProductCategory
    ,ISNULL(pv.Dollar,0) AS [Dollar]
    ,ISNULL(pv.Euro,0) AS [Euro]
    ,ISNULL(pv.Pound,0) AS [Pound]
    ,ISNULL(pv.Other,0) AS [Other]
FROM (
    SELECT *
        ,CASE
            WHEN [Currency] NOT IN ('Dollar','Euro','Pound') THEN 'Other'
            ELSE [Currency]
        END AS [newCurrency] 
    FROM #tmp
)as a
PIVOT (
    MAX([Amount]) 
    FOR [newCurrency] IN ([Dollar],[Euro],[Pound],[Other])
)as pv

你快到了。在更新 2 中稍微修改了您的查询。我认为这就是您想要的。

declare @tbl  table
(
    Product   nvarchar(50),
    Cur       nvarchar(50),
    Amount    int
)

insert into @tbl values
('p1', 'dollar',100),
('p2', 'euro',100),
('p3', 'pound',100),
('p1', 'a',100),
('p1', 'b',100),
('p2', 'c',100),
('p3', 'dollar',100),
('p3', 'euro',100),
('p2', 'euro',100),
('p2', 'euro',100),
('p1', 'j',100)

SELECT pv.Product
    ,sum(ISNULL(pv.Dollar,0)) AS [Dollar]
    ,sum(ISNULL(pv.Euro,0)) AS [Euro]
    ,sum(ISNULL(pv.Pound,0)) AS [Pound]
    ,sum(ISNULL(pv.Other,0)) AS [Other]
FROM (
SELECT *
    ,CASE
        WHEN [Cur] NOT IN ('dollar','euro','pound') THEN 'Other'
        ELSE [Cur]
    END AS [newCurrency] 
FROM @tbl
)as a
PIVOT (
    SUM([Amount]) 
    FOR [newCurrency] IN ([dollar],[euro],[pound],[Other])
)as pv
group by product