【问题标题】:tsql joining multiple tables and pivoting specific columnstsql 连接多个表并旋转特定列
【发布时间】:2014-10-05 20:34:15
【问题描述】:

我的数据如下:-

Color表:-

 Id | Red | Green | Blue | PersonId | MonthId
  1   22      53      4     1         1
  2   52     213    100     3         2
  3    2      32     44     2         3
  4   72     143      4     1         2  ......

Month 表:-

   Id | Name
   1    January  
   2    February 
   3    March    
   4    April    
   5    May    ....

Person 表:-

 Id | Name
  1   Greg  
  2   John  
  3   Gorge ...

我需要制作:-

 Name | January | February | March | April | May
 Greg   22
 Greg   53
 Greg   4
 Greg              72 ....
 John ....

我尝试了以下 case 语句,但我无法获得多种颜色

select p.Name,
       (case when m.Name = 'January' then Red) January
       from Person p, Month m, Color c where c.PersonId = p.Id and c.MonthId = m.Id

我需要在所有月份都获得Red, Green and Blue

Pivot 似乎有点太难了。如果有人有任何建议,我很乐意尝试一下。

数据表示可能不是 100% 正确,我只是想出它来说明我的观点。

【问题讨论】:

  • 使用 c# 超出了可能性范围?
  • 我不想这么说,但由于您的结果集(列)是动态的,也许您需要编写 SQL 来创建和执行动态 SQL
  • 我该怎么做呢?另外,现在我也对 C# 解决方案持开放态度

标签: sql-server tsql pivot case pivot-table


【解决方案1】:

您不能为此使用 PIVOT,因为您需要聚合颜色值(红色、蓝色、绿色列值),此处使用 PIVOT 的示例如下:

WITH Color_Values (ColorValue, PersonId, MonthId)
AS
(
    SELECT
        Red,
        PersonId,
        MonthId
    FROM Color
    UNION ALL
    SELECT
        Green,
        PersonId,
        MonthId
    FROM Color
    UNION ALL
    SELECT
        Blue,
        PersonId,
        MonthId
    FROM Color
),
Data (ColorValue, [Month], Person)
AS
(
    SELECT
        C.ColorValue,
        M.Id AS [Month],
        P.Name AS Person
    FROM [Month] AS M
    RIGHT OUTER JOIN Color_Values AS C
        ON M.Id = C.MonthId
    LEFT OUTER JOIN Person AS P
        ON P.Id = C.PersonID
)
SELECT
    Person AS Name,
    [1] AS Jan,
    [2] AS Feb,
    [3] AS Mar,
    [4] AS Apr,
    [5] AS May
FROM 
(
    SELECT ColorValue, [Month], Person
    FROM Data
) p
PIVOT
(
    COUNT (ColorValue)
    FOR [Month] IN
    ( [1], [2], [3], [4], [5] )
) AS pvt
ORDER BY
    pvt.Person;

但由于您希望显示每个值(1 月份 Greg 的 3 条记录而不是 1 条记录),因此您需要更像这样的内容:

SELECT
    P.Name,
    CASE C.MonthId WHEN 1 THEN C.Red END AS January,
    CASE C.MonthId WHEN 2 THEN C.Red END AS February,
    CASE C.MonthId WHEN 3 THEN C.Red END AS March,
    CASE C.MonthId WHEN 4 THEN C.Red END AS April,
    CASE C.MonthId WHEN 5 THEN C.Red END AS May
FROM Color AS C
INNER JOIN Person AS P
    ON P.Id = C.PersonId

UNION ALL

SELECT
    P.Name,
    CASE C.MonthId WHEN 1 THEN C.Blue END AS January,
    CASE C.MonthId WHEN 2 THEN C.Blue END AS February,
    CASE C.MonthId WHEN 3 THEN C.Blue END AS March,
    CASE C.MonthId WHEN 4 THEN C.Blue END AS April,
    CASE C.MonthId WHEN 5 THEN C.Blue END AS May
FROM Color AS C
INNER JOIN Person AS P
    ON P.Id = C.PersonId

UNION ALL

SELECT
    P.Name,
    CASE C.MonthId WHEN 1 THEN C.Green END AS January,
    CASE C.MonthId WHEN 2 THEN C.Green END AS February,
    CASE C.MonthId WHEN 3 THEN C.Green END AS March,
    CASE C.MonthId WHEN 4 THEN C.Green END AS April,
    CASE C.MonthId WHEN 5 THEN C.Green END AS May
FROM Color AS C
INNER JOIN Person AS P
    ON P.Id = C.PersonId

ORDER BY
    Name,
    January DESC,
    February DESC,
    March DESC,
    April DESC,
    May DESC

【讨论】:

    猜你喜欢
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 2016-03-30
    相关资源
    最近更新 更多