【问题标题】:Transform multiple queries into single row将多个查询转换为单行
【发布时间】:2011-04-16 23:46:20
【问题描述】:

我有一个报告,我想基于单个 SQL 语句。问题是数据是基于几个 SQL 语句的。例如。

SELECT COUNT(*) as 'Cases Opened' 
FROM tblCases 
WHERE DateAssigned BETWEEN @StartDate AND @EndDate

SELECT COUNT(*) as 'Cases Closed' 
FROM tblCases 
WHERE ClosedDate BETWEEN @StartDate AND @EndDate

SELECT COUNT(*) as 'Tickets Issued' 
FROM tblTicket 
WHERE DateIssued BETWEEN @StartDate AND @EndDate

SELECT COUNT(*) as 'Warnings Issued' 
FROM tblWarning 
WHERE DateIssued BETWEEN @StartDate AND @EndDate

有没有办法将这四个单独的 SQL 语句转换为单个 SQL 语句,以便将每个结果列为一列?例如..

Cases Opened        Cases Closed       Tickets Issued        Warnings Issued
******************************************************************************
   256         |      165          |        56           |          165

编辑我使用的是 SQL Server,表之间没有关系。

【问题讨论】:

  • 三张表之间是否存在可连接关系?
  • 他是oracle还是sql server?

标签: sql reporting


【解决方案1】:

如果您在 SQLServer 中运行,请查看 pivot 语句

【讨论】:

    【解决方案2】:

    您可以联合和旋转数据,如下所示:

    SELECT SUM(CASE WHEN FieldName='Cases Opened' THEN Value ELSE 0 END) AS Cases_Opened,
           SUM(CASE WHEN FieldName='Cases Closed' THEN Value ELSE 0 END AS Cases_Closed,
           SUM(CASE WHEN FieldName='Warning Issued' THEN Value ELSE 0 END) AS Warnings_Issued,
           SUM(CASE WHEN FieldName='Tickets Issued' THEN Value ELSE 0 END) AS Tickets_Issued
    FROM 
    (
    SELECT COUNT(*) as Value, 'Cases Opened' as FieldName
    FROM tblCases 
    WHERE DateAssigned BETWEEN @StartDate AND @EndDate
    
    UNION
    
    SELECT COUNT(*) as Value, 'Cases Closed' as FieldName
    FROM tblCases 
    WHERE ClosedDate BETWEEN @StartDate AND @EndDate
    
    UNION
    
    SELECT COUNT(*) as Value, 'Tickets Issued' as FieldName
    FROM tblTicket 
    WHERE DateIssued BETWEEN @StartDate AND @EndDate
    
    UNION
    
    SELECT COUNT(*) as Value, 'Warnings Issued' as FieldName
    FROM tblWarning 
    WHERE DateIssued BETWEEN @StartDate AND @EndDate
    )
    

    【讨论】:

      【解决方案3】:
      select 
       (
       SELECT COUNT(*)  
       FROM tblCases 
       WHERE DateAssigned BETWEEN @StartDate AND @EndDate
       ) as 'Cases Opened' ,
       (SELECT COUNT(*)  
       FROM tblCases 
       WHERE ClosedDate BETWEEN @StartDate AND @EndDate
       ) as 'Cases Closed' ,
       (SELECT COUNT(*)  
       FROM tblTicket 
       WHERE DateIssued BETWEEN @StartDate AND @EndDate
       ) as 'Tickets Issued' ,
       (SELECT COUNT(*) 
       FROM tblWarning 
       WHERE DateIssued BETWEEN @StartDate AND @EndDate
       )  as 'Warnings Issued'
      from dual
      

      在 oracle 中需要 from dual,mysql 支持但不是必需的,我不确定 sqlserver,因为我面前没有。

      【讨论】:

      • 但并非所有 SGBD 都提供“from dual”
      • SQL Server 中不需要。
      • @Chuck Vose: Ofc 这是“更好” :) 来源stackoverflow.com/questions/73751/…
      • 同意。必须记住,SO拥有一切:P
      猜你喜欢
      • 2014-03-02
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 2017-03-23
      • 2020-05-21
      • 2019-12-27
      • 1970-01-01
      相关资源
      最近更新 更多