【问题标题】:Divide the results of two select queries将两个选择查询的结果相除
【发布时间】:2021-09-14 18:26:27
【问题描述】:

我有两个 SQL 计数查询,它们本身工作正常,它们是:

SELECT count(*) AS TOTAL_PROGRESS_BY_LINE_
FROM dbo.PID_Components_PROCESS_LINES
WHERE ISOGEN_LINE_PROGRESS_ = 'C'

RESULT: TOTAL_PROGRESS_BY_LINE_ = 26

SELECT count(*) AS TOTAL_LINES_BY_PROJECT_
FROM dbo.PID_Components_PROCESS_LINES
WHERE PROJECT_NUMBER_ = 'PJ001234'

RESULT: TOTAL_LINES_BY_PROJECT_ = 130

现在如何添加到查询中以获得 26/130 的百分比??

我有一个关于如何获取百分比的新查询。

这里是:

SELECT ISOGEN_LINE_PROGRESS_, PROJECT_NUMBER_,
CASE
    WHEN ISOGEN_LINE_PROGRESS_ = 'A' THEN 'NOT IN MODEL'
    WHEN ISOGEN_LINE_PROGRESS_ = 'B' THEN 'ROUGHED IN'
    WHEN ISOGEN_LINE_PROGRESS_ = 'C' THEN 'PARTIAL CHECK'
    WHEN ISOGEN_LINE_PROGRESS_ = 'D' THEN 'READY FOR FINAL CHECK'
    WHEN ISOGEN_LINE_PROGRESS_ = 'E' THEN '100% COMPLETE'
    WHEN ISOGEN_LINE_PROGRESS_ = '0' THEN 'ISSUE FOR CONSTRUCTION'
END AS PROGRESS_PER_LINE_
FROM PID_Components_PROCESS_LINES
WHERE PROJECT_NUMBER_ = 'PJ001234'
ORDER BY ISOGEN_LINE_PROGRESS_

这将返回以下结果:

ISOGEN_LINE_PROGRESS_   PROJECT_NUMBER_ PROGRESS_PER_LINE_
A                       PJ001234        NOT IN MODEL
B                       PJ001234        ROUGHED IN
C                       PJ001234        PARTIAL CHECK
D                       PJ001234        READY FOR FINAL CHECK

如果我从查询中删除Distinct,显然每个进度级别都有多行。如何在上述不同的查询中添加一个列,以在最后一列中显示与总行数相比每个进度级别的速率或百分比?

【问题讨论】:

  • 您要划分的值是整数。你想要一个整数结果,即0,百分比作为整数,即20,还是其他的东西(0.200020.00'Not much.')?
  • 我希望结果为 20.00。很抱歉,我不熟悉我认为“更高级”的查询。
  • 我计算的列是 varchar 数据类型,如果这有影响的话?
  • 请将新问题放入 新问题。如果您更改最初的问题,标题、cmets 和答案将没有任何意义,如果您尝试将另一个问题插入第一个问题,这一切都会非常混乱。

标签: sql sql-server tsql divide


【解决方案1】:

选择它们作为子查询。

默认情况下,结果将是一个整数,因为count(*) 返回一个int。对于decimal 结果转换为decimal

SELECT (
    SELECT CONVERT(decimal(9,2),COUNT(*)) AS TOTAL_PROGRESS_BY_LINE_
    FROM dbo.PID_Components_PROCESS_LINES
    WHERE ISOGEN_LINE_PROGRESS_ = 'C'
) / (
    SELECT CONVERT(decimal(9,2),COUNT(*)) AS TOTAL_LINES_BY_PROJECT_
    FROM dbo.PID_Components_PROCESS_LINES
    WHERE PROJECT_NUMBER_ = 'PJ001234'
)

【讨论】:

  • @Drafter-SQL 那是因为当您在 SQL Server 中将一个 int 除以一个 int 时,结果始终是一个 int。因此,如我所示,转换为十进制。如果您在问题中显示了您想要的结果,这将得到解决。
【解决方案2】:

您可以在一个查询中使用条件聚合和简单除法:

select
  100.0 *
  count(
    case when ISOGEN_LINE_PROGRESS_ = 'C'
    then 1
    end
  )
  /
  nullif(count(
    case when PROJECT_NUMBER_ = 'PJ001234'
    then 1
    end
  ), 0) as rate_
FROM dbo.PID_Components_PROCESS_LINES
WHERE ISOGEN_LINE_PROGRESS_ = 'C'
  or PROJECT_NUMBER_ = 'PJ001234'

【讨论】:

  • 这也返回为 0 的速率。如果有区别,我正在计算的列是 varchar 数据类型?
  • @Drafter-SQL 我已将代码更新为隐式转换为十进制,并将所需的比例改为 100
  • 成功了,结果返回 20.000。感谢所有帮助,并为未提供一些示例数据而道歉。我有一个后续问题,这次将汇总一些示例数据以提供问题。
  • @Drafter-SQL 不客气。如果您认为某些答案非常符合您的需求并提供了足够好的解决方案,您可以accept it or upvote 指出它有用。
【解决方案3】:
DECLARE @firstone INT;
DECLARE @secondone INT;
SELECT @firstone = count(*)
FROM dbo.PID_Components_PROCESS_LINES
WHERE ISOGEN_LINE_PROGRESS_ = 'C';

SELECT @secondone = count(*)
FROM dbo.PID_Components_PROCESS_LINES
WHERE PROJECT_NUMBER_ = 'PJ001234';

SELECT @firstone / @secondone AS resultthing

SELECT @firstone /CAST(@secondone AS DECIMAL (9,2))

【讨论】:

  • 我很欣赏快速响应,但返回 0???
  • 您可能需要 CAST 结果但未指定
【解决方案4】:

您可以使用公用表表达式来获取计数,然后 select 在一个 swell foop 中获得所需的结果:

with Counts as (
  select
    ( select Count(*) from Sys.Tables ) as NumberOfTables,
    ( select Count(*) from Sys.Columns ) as NumberOfColumns
  )
  select NumberOfTables, NumberOfColumns,
    NumberOfColumns / NumberOfTables as ColumnsPerTable,
    ( 100 * NumberOfColumns ) / NumberOfTables as IntegerPercentColumnsPerTable,
    ( 100.0 * NumberOfColumns ) / NumberOfTables as NumericPercentColumnsPerTable
    from Counts;

由于您选择不提供 DDL 和示例数据,因此我使用了现有表。就这样吧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2014-02-04
    • 1970-01-01
    相关资源
    最近更新 更多