尝试获取不同软件版本的不同文件的不同值的总和
Posted
技术标签:
【中文标题】尝试获取不同软件版本的不同文件的不同值的总和【英文标题】:Trying to get the sum of distinct values for distinct files for distinct software versions 【发布时间】:2015-02-01 09:06:05 【问题描述】:我在 SQL Server Management Studio 工作。我有一张表,里面有模拟数据。其中四列是“Version”、“Scenario_Name”、“Measure”和“Value”。 “版本”列将包含软件版本号。 “Scenario_Name”列将包含场景的文件名。 “度量”列本质上将具有场景的数据类型条目,例如时间、金钱、成本等。“值”列将记录与度量列关联的数字。例如,特定场景的“度量”可能是“人数”,“值”是 100。好吧,希望我的设置有意义。
我需要编写一个查询,该查询将获取特定“Measures”的“Value”列中的整数总和,并将该总和值作为“Measure”=“SUM”的新行条目。现在我可以完成其中的一部分,但棘手的部分是我需要将特定“度量”条目的这两个“值”整数相加,但对于每个 DISTINCT“场景名称”和可能在表中的每个“版本” .
我需要的结果看起来像这样。如果我对每个场景的工作日人数和周末人数有一个“度量”条目,那么我想生成一个新列,记录每个场景和每个不同版本的总人数(周末 + 工作日) .
编辑:我不想生成新列,我想添加新的行条目。
我已经做到了这个大声笑(我还在学习很多这些东西)
SELECT Scenario_Name, Version, SUM(Value) AS Total_People FROM TableName
WHERE Measure = 'Weekends' OR Measure = 'Weekdays'
GROUP BY Scenario_Name, Version
这基本上是我努力的结果。我可以通过使用 where Scenario_Name="" 和 Version="" 来得到总和,但我不知道如何为所有不同的条目做到这一点,老实说,我不知道如何在基本的东西之外做到这一点。
此外,我必须弄清楚如何将这个想法放入一个非常大的(已经编写但不是由我查询)中,它从多个数据库中获取填充此表的所有内容。
编辑:
| Scenario_Name | Measure | Value |
|---------------|-------------|-------|
| Scenario1 | Weekends | 10 |
| Scenario1 | Weekdays | 25 |
| Scenario1 | TotalPeople | 35 |
| Scenario2 | Weekends | 12 |
| Scenario2 | Weekdays | 30 |
| Scenario2 | TotalPeople | 42 |
| Scenario3 | Weekends | 5 |
| Scenario3 | Weekdays | 15 |
| Scenario3 | TotalPeople | 20 |
“测量”有更多条目,并且每个版本都会重复场景文件。但是,关键是我希望 Measure "TotalPeople" 下的条目是查询的结果,该查询从 Value 列中提取浮点数并对 Weekends 和 Weekdays 求和并将该值放入 TotalPeople
编辑:我继续想出一些东西。这是我在第一次编辑之前的最后陈述中提到的那个查询的一个例子。
SELECT (SELECT attributedata FROM [' +@dbname+ '].table1 WHERE AttributeName = ''Scenario Name'') AS Scenario_Name,
(SELECT attributedata FROM [' +@dbname+ '].table1 where AttributeName = ''Version'') AS Version,
CAST(COUNT(*) AS float)/MAX(repnum) AS value,
finalDisposition AS Measure,
GETDATE() AS DateRun,
(SELECT ' + CAST(@testid as CHAR) +') AS TestNum
FROM [' +@dbname+ '].table2
GROUP BY FinalDisposition
我想我只需要使用 UNION 来添加另一个,但将计算内容更改为 Value 并将 TotalPeople 设为 Measure
所以使用这个,有人对他们将如何做到这一点有任何想法吗?我知道除了调用 Measure 和 Value 的查询之外的所有内容都需要保持不变。
还值得注意的是,“测量”列的条目是从不同数据库中的条目中提取的。与每个 Scenario_Name 关联并使用 @dbname 变量提取的数据库。那么我将如何使用该格式添加一个名为 TotalPeople 的新“度量”条目?
SELECT CAST(COUNT(id) AS float) AS Value, FinalDisposition AS Measure FROM [' +@dbname '].table2
WHERE FinalDisposition = 'Weekdays' OR FinalDisposition = 'Weekends'
GROUP BY FinalDisposition
正在计算的“id”是场景中来自其他数据库的人员的 id,就像 FinalDisposition 是来自数据库中其他表的列名一样。这将提取我需要的值,但现在我如何对它们求和并使总和等于一个新的 Measure 条目?
最终编辑(希望如此): 这就是我现在正在使用的。那么相关的块。
select (cast(count(id) as float)) as Value, 'TotalPeople' as Measure
from table1
where FinalDisposition = 'Weekends' or FinalDisposition = 'Weekdays'
group by FinalDisposition
除了总和之外,一切都有效。我现在需要的只是能够将 Value 条目相加。
【问题讨论】:
“生成一个新列”?您想在查询输出中包含派生列,或者修改表以便实际在其中创建新的永久列? 我希望总和的结果成为连续的新条目。我正在使用的表主要由“度量”列组织,然后每个度量都有一个特定的“值”条目。其他列实际上只是为了区分运行的不同场景以及使用的版本。我希望“总计”或“总和”成为“度量”中的新条目,实际总和是“值”列中的数字 为什么您的示例中的查询不起作用 - 它是否返回错误?我想我错过了你正在寻找的东西。 如果不清楚,我很抱歉。上面的查询有效。我把它放在那里作为我迄今为止提出的一个例子。上面的查询只是计算一个新列 Total_People,但我希望获取“工作日”和“周末”的总和,并将这些结果排序到现有列中。例如,每个场景的新条目将在显示 Total_People 的“度量”列中找到,“值”列中的条目将是 SUM。这有意义吗? 也许您正在谈论旋转数据。您能否说明问题中的结果集应该是什么样子? 【参考方案1】:这应该可以解决问题:
SELECT
Scenario_Name
, Version
, Measure
, Value
from
(
SELECT Scenario_Name, Measure, Version, SUM(Value) AS Value , 1 as ordering
FROM #TableName
GROUP BY Scenario_Name, Measure, version
UNION ALL
SELECT Scenario_Name, 'TotalPeople', Version, SUM(Value) , 2 as ordering
FROM #TableName
GROUP BY Scenario_Name, Version
) t
Order by Scenario_Name, ordering, Measure
编辑: 要添加到您的查询中,请尝试以下操作(您的查询超出 ... 所在的位置):
...
UNION ALL
SELECT
( SELECT attributedata
FROM [' +@dbname+ '].table1
WHERE AttributeName = ''Scenario Name''
) AS Scenario_Name
, (
SELECT attributedata
FROM [' +@dbname+ '].table1
where AttributeName = ''Version''
) AS Version
, CAST(COUNT(*) AS float)/MAX(repnum) AS value
, 'TotalPeople' AS Measure
, GETDATE() AS DateRun
, (SELECT ' + CAST(@testid as CHAR) +') AS TestNum
FROM [' +@dbname+ '].table2
编辑2: 如果您尝试完成相同的事情,我认为解决方案基本上是相同的:
select (cast(count(id) as float)) as Value, FinalDisposition as Measure
from TML_Casualties
where FinalDisposition = 'DOW' or FinalDisposition = 'KIA'
group by FinalDisposition
UNION ALL
select (cast(count(id) as float)) as Value, 'TotalDeaths' as Measure
from TML_Casualties
where FinalDisposition = 'DOW' or FinalDisposition = 'KIA'
【讨论】:
我添加了一些额外的东西来展示我认为我必须进入的方向。由于我将其添加到预先存在的查询中,我必须使用联合 为了在结果集中获得小计,是的,使用联合是有意义的。如果你有两个表,加入它们而不是使用内联子查询 是的,我知道这是有道理的,我很可能会回去解决这个问题,但是其他人编写了原始查询,它可以工作,但需要这个额外的功能。 最后一个查询实际上就是我需要的一切,除了我需要能够将两个值相加为 Value 并且我需要 Measure 等于“TotalPersons”。现在 Measure 正在从另一个表中提取,因此所有条目都来自另一个表中名为 FinalDisposition 的列。 好的,这绝对解决了将 TotalPeople 输入到 Measure 列的问题,现在我只需要能够取 Value 列的总和即可。我对聚合函数不是很好,但是这个:选择 cast(sum(count(id) as float)) 作为 Value。这:选择 sum(cast(count(id) as float)) as Value 不起作用以上是关于尝试获取不同软件版本的不同文件的不同值的总和的主要内容,如果未能解决你的问题,请参考以下文章
linux也分不同发行版,不同版本类型的Linux命令有所区别