【问题标题】:SQL query - divide two numbers from same columnSQL查询 - 将同一列中的两个数字相除
【发布时间】:2013-12-18 19:04:25
【问题描述】:

我正在使用托管 SQL 2008 数据库(因此无法创建表或修改值),并希望将同一列中的两个数字相除以获得单个百分比答案。这些值输入到同一列 (TA_ANS_ANSWER),但输入的值基于另一个字段,即问题 (TA_ANS_QUESTION)。 例如本月;

第一个问题 - “电子学习用户列表中的承包商总数” - 答案输入“430”。

第二个问题 - “电子学习导入报告中的承包商总数” - 答案输入“357” 我需要得到上述值的 83%。

随着答案的填充,我需要为每个月计算一个百分比值。 下面的查询给出了返回上一个 MONTH 的名称(例如 Nov)、PPM ID 和 Answer(例如 430)的基本查询。我可以修改它以返回两行,每个回答的问题 1,但我只想要一个包含月份、PPM ID 和百分比计算的行。

如果答案让我眼前一亮,我们深表歉意,但我们将不胜感激。

SELECT CONVERT(varchar(3), TA_DUE_DATE-28, 100) AS MONTH, 
TA_TASK_ID AS PPM, 
F_TASK_ANS.TA_ANS_ANSWER AS ANSWER

FROM F_TASK_ANS
INNER JOIN F_TASKS
ON F_TASK_ANS.TA_ANS_FKEY_TA_SEQ = F_TASKS.TA_SEQ

WHERE TA_ANS_ANSWER <> ''
AND F_TASKS.TA_FKEY_CTR_SEQ = 126
AND F_TASK_ANS.TA_ANS_QUESTION LIKE '%Total No. Contractors on e-learning User List%'
AND (TA_HIST_STATUS IS NULL OR TA_HIST_STATUS = 'COMPLETE')
AND TA_TASK_ID LIKE '%6025'
AND TA_DUE_DATE >= GETDATE()-360
AND TA_DUE_DATE <= GETDATE()+7

ORDER BY PPM

【问题讨论】:

  • 请发布示例数据和所需的输出。

标签: sql sql-server pivot


【解决方案1】:

您正在寻找的东西称为枢轴。这可以使用 PIVOT 关键字完成,也可以使用 GROUP BY 和 MIN(CASE WHEN ... END) 手动完成。查看标记为“pivot”的其他答案以获取更多示例。

SELECT CONVERT(varchar(3), TA_DUE_DATE-28, 100) AS MONTH, 
TA_TASK_ID AS PPM, 
MIN(CASE WHEN F_TASK_ANS.TA_ANS_QUESTION LIKE '%Total No. Contractors on e-learning inducted report%' THEN F_TASK_ANS.TA_ANS_ANSWER END) +0.0
  / MIN(CASE WHEN F_TASK_ANS.TA_ANS_QUESTION LIKE '%Total No. Contractors on e-learning User List%' THEN F_TASK_ANS.TA_ANS_ANSWER END) 
  AS PERCENTAGE

FROM F_TASK_ANS
INNER JOIN F_TASKS
ON F_TASK_ANS.TA_ANS_FKEY_TA_SEQ = F_TASKS.TA_SEQ

WHERE TA_ANS_ANSWER <> ''
AND F_TASKS.TA_FKEY_CTR_SEQ = 126
AND (F_TASK_ANS.TA_ANS_QUESTION LIKE '%Total No. Contractors on e-learning User List%' OR
    (F_TASK_ANS.TA_ANS_QUESTION LIKE '%Total No. Contractors on e-learning inducted report%')
AND (TA_HIST_STATUS IS NULL OR TA_HIST_STATUS = 'COMPLETE')
AND TA_TASK_ID LIKE '%6025'
AND TA_DUE_DATE >= GETDATE()-360
AND TA_DUE_DATE <= GETDATE()+7
GROUP BY CONVERT(varchar(3), TA_DUE_DATE-28, 100),TA_TASK_ID

【讨论】:

  • 感谢 Anon 提供的帮助。不幸的是,我收到以下错误; System.Data.SqlClientError:将 mvarchar 转换为数字数据类型的算术溢出错误。我需要将 2 个答案转换为十进制吗?
  • 更新 - 刚刚使用演员表,我是对的,您的解决方案运行良好。 CAST(MIN(CASE WHEN F_TASK_ANS.TA_ANS_QUESTION LIKE '%Total No. Contractors on e-learning inducted report%' THEN F_TASK_ANS.TA_ANS_ANSWER END) AS NUMERIC(5,2)) / CAST(MIN(CASE WHEN F_TASK_ANS.TA_ANS_QUESTION LIKE ' %Total No. Contractors on e-learning User List%' THEN F_TASK_ANS.TA_ANS_ANSWER END) AS NUMERIC(5,2))*100 非常感谢您的帮助。 :)
【解决方案2】:

一个可能的答案是使用公用表表达式 (CTE)。像这样的:

;with TotalOnELearningList (Month, TaskID, NumberOnList) as
(
    select
        convert(varchar(3), ta_due_date - 28, 100) as month,
          ta_task_id,
          f_task_ans.ta_ans_answer
    from ...
),
TotalOnInductedReport (Month, TaskID, NumberInductedReport) as
(
    ...
),
select
    case NumberInductedReport when 0 then 0 else NumberOnList / NumberInductedReport * 100 end as 'Percent',
    ...
from TotalOnELearningList
inner join TotalOnIndutedReport
   on...

【讨论】:

  • 嗨,保罗。恐怕您的知识远远超出了我的知识,而且我不确定如何申请 CTE(不是我熟悉的东西)。更糟糕的是,在您写“...”时的回答中,我不清楚我应该输入什么。抱歉,我是个新手,但我很感谢您的时间。
猜你喜欢
  • 2014-02-07
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
  • 2020-01-29
  • 1970-01-01
相关资源
最近更新 更多