【问题标题】:"Crosstab" query in SQL Server 2008SQL Server 2008 中的“交叉表”查询
【发布时间】:2014-04-01 22:31:38
【问题描述】:

使用 SQL Server 2008,希望查询一个表,但要查找特定的输出。当前表,名为 fmCalendar:

>Date       Calendar    Days
>12/30/2014 Canada      1
>12/30/2014 Europe      1
>12/30/2014 UK          1
>12/30/2014 US          1
>12/29/2014 Canada      2
>12/29/2014 Europe      2
>12/29/2014 UK          3
>12/29/2014 US          3
>...

我希望输出如下所示:

>Date       Canada  Europe  UK  US
>12/30/2014 1       1       1   1
>12/29/2014 2       2       3   3
>...

我该怎么做?提前致谢

【问题讨论】:

    标签: sql-server-2008 crosstab


    【解决方案1】:

    我会这样查询

    select
      Date,
      Sum(case when Calendar = 'Canada' then Days else 0 end) as Canada,
      Sum(case when Calendar = 'Europe' then Days else 0 end) as Europe,
      Sum(case when Calendar = 'UK' then Days else 0 end) as UK,
      Sum(case when Calendar = 'US' then Days else 0 end) as Us,
      Sum(case when Calendar not in ('Canada','Europe','UK','US') then Days else 0 end) 
      as Other
    from
      MyTable
    group by
       Date
    

    【讨论】:

    • 这似乎可行,但我得到的所有四个区域的列名都无效
    • 我想通了 - 双引号与单引号 - 已修复 - 谢谢!
    • 固定引号和格式。如果它适合您,请选择作为解决方案
    • 如何“选择解决方案”?
    • @mdecav 当答案是对您帮助最大的答案或您使用过的答案时,您可以接受它作为正确答案。您应该在每个答案中看到一个复选标记,单击它使其成为接受的答案。 (accepted answer)
    【解决方案2】:

    你可以做一个PIVOT:

    SELECT *
    FROM fmCalendar AS T
    PIVOT(SUM([days]) FOR Calendar IN ([Canada],[Europe],[UK],[US])) AS P
    

    Here is an sqlfiddle 带有演示。结果是:

    ╔═══════════════════╦════════╦════════╦════╦════╗
    ║       DATE        ║ CANADA ║ EUROPE ║ UK ║ US ║
    ╠═══════════════════╬════════╬════════╬════╬════╣
    ║ December, 29 2014 ║      2 ║      2 ║  3 ║  3 ║
    ║ December, 30 2014 ║      1 ║      1 ║  1 ║  1 ║
    ╚═══════════════════╩════════╩════════╩════╩════╝
    

    【讨论】:

    • 这似乎是一个更简单(也更容易)的解决方案,但我在“PIVOT”附近遇到语法错误。不知道为什么。
    • @mdecav 好吧,这 很奇怪,因为在 sqlfiddle 中使用了相同的查询并且它不会引发错误。您确定您使用的是完全相同的查询吗?
    • 是的;我不知道为什么。以前从未使用过 PIVOT。
    • @mdecav 您查询的数据库(或服务器)可能不是 SQL Server 2008,而是 2000
    猜你喜欢
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 2014-10-23
    相关资源
    最近更新 更多