【问题标题】:SQL Pivot not workingSQL 枢轴不起作用
【发布时间】:2015-12-17 03:13:24
【问题描述】:

我在 SQL 中做一个支点,但它不起作用,有人可以帮忙解决什么问题吗? ,下面是我的结果集、所需的输出和我的查询。

-->> #Final 临时表是使用以下查询创建的。

CREATE TABLE #Final
    (
       Name VARCHAR(100),
       Code VARCHAR(20),
       Amount MONEY
    )

-->> Insert data, here i insert all data that i needed
INSERT INTO [#Final]
(
    [Name],
    [Code],
    [Amount]
)
SELECT something...
-----------------------------------------------------------------

这是结果集

Name        Code    **Amount**
Batman      11111   4472.23
Batman      11111   -1788.89
Batman      22222   5166.98
Batman      22222   -5166.98
Batman      22222   5166.98
Batman      33333   6880.43
Batman      33333   -2293.47
Robin       11111   8278.54
Robin       11111   41392.66
Robin       22222   15940.95
Robin       22222   79704.71
Robin       33333   16557.23
Robin       33333   106136.1
Robin       33333   4669.99
Superman    11111   8944.39
Wolverine   11111   32782.99
Wolverine   11111   32782.99
Wolverine   11111   49671.2
Wolverine   11111   16557.06
Wolverine   22222   127527.54
Wolverine   33333   105074.74
Wolverine   33333   -420.3
-----------------------------------------------------------------

-->> My pivot query
SELECT [pvt].[Name], [1],[2],[3]
FROM 
(
    SELECT Name, Code, Amount FROM #Final
) src
PIVOT
(
    SUM(Amount) FOR Code IN ([1],[2],[3])
) pvt

amount的结果全部为NULL

            11111   22222   33333
Batman      NULL    NULL    NULL
Robin       NULL    NULL    NULL
Superman    NULL    NULL    NULL
Wolverine   NULL    NULL    NULL
-----------------------------------------------------------------

预期结果应该是:(每个代码每个名称的金额总和)

            11111       22222       33333
Batman      2683.34     5166.98     4586.96
Robin       49671.2     95645.66    127363.32
Superman    8944.39            0            0
Wolverine   131794.24   127527.54   104654.44

任何帮助将不胜感激。提前致谢

【问题讨论】:

    标签: sql sql-server sql-server-2012 pivot-table


    【解决方案1】:

    您的列名应该是:

    [11111],[22222],[33333]
    

    代替:

    [1],[2],[3]
    

    这是您的最终查询:

    SELECT [pvt].[Name], [11111],[22222],[33333]
    FROM 
    (
        SELECT Name, Code, Amount FROM #Final
    ) src
    PIVOT
    (
        SUM(Amount) FOR Code IN ([11111],[22222],[33333])
    ) pvt
    

    获得所需结果的另一种方法是使用条件聚合:

    SELECT
        Name,
        [11111] = SUM(CASE WHEN Code = 11111 THEN Amount Else 0 END),
        [22222] = SUM(CASE WHEN Code = 22222 THEN Amount Else 0 END),
        [33333] = SUM(CASE WHEN Code = 33333 THEN Amount Else 0 END)
    FROM #Final
    GROUP BY Name
    

    【讨论】:

    • 当然,他可以把ISNULL放在外面的SELECT上。
    • @FelixPamittan 哇太棒了! ,现在我知道出了什么问题 .. 这是我第一次在 SQL 中创建枢轴 :) ,我研究了如何创建...我没有观察到那个 .. 这是完美的! ,将此标记为答案。
    • @Japongskie,这就是为什么我更喜欢条件聚合方法,
    • @FelixPamitstan,啊,你能告诉我如何使用条件聚合来实现吗? ,当我在谷歌搜索时..我看到的第一件事就是那个枢轴..我怎么能在条件聚合中做到这一点?
    • 基于 Jeff Moden 的this article,条件聚合或交叉表具有优势。
    【解决方案2】:

    使用[11111],[22222],[33333] 代替[1],[2],[3]

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 2015-04-30
      • 2020-07-22
      相关资源
      最近更新 更多