【问题标题】:How would I make columns of a returned table equal to rows of another table, like this?我如何使返回表的列等于另一个表的行,像这样?
【发布时间】:2016-06-24 15:27:55
【问题描述】:

我有 3 张类似的桌子

         Dudes
==========================
 id |    name   
==========================
  1 |  "Marshal Mathers"
--------------------------
  2 |  "Limp Biscuit"
--------------------------


        Questions 
===========================
 id |       qtext
===========================
 1  | "What's up, dog?"
---------------------------
 2  | "C# or C++?"
---------------------------

          Answers
=======================================================
 id |  dude_id  | question_id |       atext
=======================================================
  1 |      1       |       1     |    "Nothing much"
-------------------------------------------------------
  2 |      2       |       1     |     "Oh, you know"
-------------------------------------------------------
  3 |      1       |       2     |         "C++"
-------------------------------------------------------- 

我对 Make-A-Wish Foundation (Stack Overflow) 的希望是一个在该示例中返回的 sproc

===========================================================
          name         |  What's up, dog?  |  C# or C++?   
===========================================================
    "Marshal Mathers"  |   "Nothing much"  |    "C++"
-----------------------------------------------------------
     "Limp Biscuit"    |   "Oh, you know"  |     NULL
------------------------------------------------------------

这有可能吗?如果可以,该怎么做?

【问题讨论】:

  • Google SO sql server pivot.

标签: sql sql-server tsql stored-procedures database-design


【解决方案1】:

这是 sgeddes 答案的动态版本。这种技术被称为dynamic crosstab.

DECLARE @sql NVARCHAR(MAX)

SELECT @sql = 
'SELECT
    d.name' + CHAR(10)

SELECT @sql = @sql +
'   , MAX(CASE WHEN q.id = ' + CONVERT(VARCHAR(10), id) + ' THEN a.atext END) AS ' 
    + QUOTENAME(qtext) + CHAR(10)
FROM #Questions

SELECT @sql = @sql +
'FROM #Dudes d
LEFT JOIN #Answers a
    INNER JOIN #Questions q
        ON q.id = a.question_id
    ON a.dude_id = d.id
GROUP BY d.id, d.name
ORDER BY d.id'

PRINT(@sql)
EXEC(@sql)

DEMO

【讨论】:

  • # 符号是干什么用的?在 SQL 的上下文中从未见过它。
  • 这只是使用的临时表。
【解决方案2】:

假设我正确理解您的问题,您可以使用conditional aggregationpivot 您的结果与outer join

select d.id, d.name, 
       max(case when q.id = 1 then q.qtext end) whats_up_dog,
       max(case when q.id = 2 then q.qtext end) c_sharp_plus
from dudes d
       left join answers a on d.id = a.partner_id 
       left join questions q on q.id = a.question_id
group by d.id, d.name

【讨论】:

  • 你有神奇的数字,12,漂浮在那里。我想知道有什么方法可以概括这一点?
  • @SubparWebDev - 它们并不神奇 - 它们代表您想要作为列的问题 ID 的值。问题 ID 1 =“怎么了,狗?”根据您的问题...如果您不知道要返回的列,则必须使用dynamic sqlpivot 结果。很多关于如何做到这一点的例子......
猜你喜欢
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 2018-12-08
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
相关资源
最近更新 更多