【问题标题】:SQL UNION return more than on columnSQL UNION 返回多于列
【发布时间】:2014-01-04 00:38:58
【问题描述】:

我有以下 sql 语句。将结果全部集中在一列中。我想要的是让仪表板标题返回一次,然后每个图表中的一行属于另一列中的仪表板。

SELECT 
    DashBoards.Title AS [Dash Board] 
FROM DashBoards 
GROUP BY DashBoards.Title 

UNION ALL

SELECT  
    Charts.Title AS Chart
FROM Charts 
INNER JOIN DashBoardCharts 
    ON Charts.ID = DashBoardCharts.ChartID 
INNER JOIN DashBoards 
    ON DashBoardCharts.DashBoardID = DashBoards.DashBoardID

此查询涉及三个表:

CREATE TABLE Dashboards (
    DashboardID INTEGER NOT NULL PRIMARY KEY,
    Title CHAR(50) NOT NULL,
    ISDEFAULT BIT NOT NULL,
    CompanyID INTEGER NULL
);    
INSERT INTO Dashboards
VALUES (1,'Main DashBoard', 1, NULL);

CREATE TABLE Charts (   
    ID INTEGER NOT NULL PRIMARY KEY,
    Title CHAR(50) NOT NULL,
    SPName CHAR(50) NOT NULL,
    XField CHAR(50) NOT NULL,
    YField CHAR(50) NOT NULL
);    
INSERT INTO Charts
VALUES (1,'Alerting and Monitoring', 'spGetData', 'SumType', 'SumAmount');

CREATE TABLE DashboardCharts (
    DashBoardID INTEGER NOT NULL FOREIGN KEY REFERENCES Dashboards (DashboardID),
    ChartID INTEGER NOT NULL FOREIGN KEY REFERENCES Charts (ID)
);
INSERT INTO DashboardCharts
VALUES (1, 1); 

我正在寻找的结果是这样的。

仪表板图表
“主仪表板”、“销售分析”
“警报和监控”
“另一个仪表板”、“成本管理”
'结算管理'

I.E.只返回一次仪表板标题以及属于该仪表板的所有图表。

【问题讨论】:

  • 请从每个表中发布一个小数据样本,以及您希望实现的输出的样本。 (请勿截图,请以文本形式输入数据,以便我们在必要时将其移植到sqlfiddle.com
  • 请看原始问题。感谢您的帮助。
  • 没有为DashboardCharts 表提供的足够数据来回答您的问题。预期的结果也不是很清楚——你能详细说明一下吗?
  • 啊,我明白了。除非您希望将所有图表作为字符串连接成一行,否则您不能只返回仪表板一次,然后是所有图表。 SQL 将以 2 维格式返回结果,并与每个图表重复的仪表板一起返回它们。您的应用程序代码有责任格式化它们以显示您想要的方式,而不是 RDBMS'
  • 感谢您提供此信息,我将在我的应用程序代码中探索处理此问题的方法。

标签: sql sql-server


【解决方案1】:
SELECT d.Title AS Dashboard, c.Title AS Chart
FROM  Dashboards AS d
      INNER JOIN DashboardCharts AS dc
        ON d.DashboardID = dc.DashboardID
      INNER JOIN Charts AS c
        ON dc.ChartID = c.ChartID

我根据提供的信息对您的表结构和数据做了一些假设。见SQL Fiddle

对于未来的 SQL 问题,了解表结构和数据会很有帮助。即使是简单的表格和数据的 CSV 表示形式,也可以极大地提高您收到的答案的质量,例如:

仪表板表

DashboardID,Title
1,'Main Dashboard'
2,'Alerting and Monitoring'

【讨论】:

  • @user3157613 请使用此信息编辑您的原始问题,在评论中很难阅读。
  • 感谢您的回复原始问题尚未更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 2011-11-09
相关资源
最近更新 更多