我在SQL Server Management Studio中工作。我有一张包含模拟数据的表格。其中四列是“Version”,“Scenario_Name”,“Measure”和“Value”。 “版本”列中将包含软件版本号。 “Scenario_Name”列将包含其中的方案的文件名。 “度量”列将基本上具有时间,金钱,成本等方案的数据类型条目。“值”列将记录与“度量”列关联的数字。例如,特定场景的“度量”可能是“人数”,而“值”则为100.好的希望我的设置有意义。
我需要编写一个查询,它将“Value”列中的整数之和用于特定的“Measures”,并使此sum值成为“Measure”=“SUM”的新行条目。现在我可以做其中的一部分,但棘手的部分是我需要将特定“测量”条目的两个“值”整数相加,但是对于每个DISTINCT“Scenario_Name”以及可能在表中的每个“Version” 。
我需要的结果看起来像这样。如果我有一个“测量”条目,表示每个场景的工作日人数和周末人数,那么我想生成一个新列,该列将记录每个场景和每个不同版本的总人数(周末+工作日)
编辑:我不想生成新列,我想添加新的行条目。
我已经到了这个大声笑(我还在学习很多东西)
SELECT Scenario_Name, Version, SUM(Value) AS Total_People FROM TableName
WHERE Measure = 'Weekends' OR Measure = 'Weekdays'
GROUP BY Scenario_Name, Version
这基本上就是我所做的。我可以通过使用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”有更多条目,每个版本的Scenario文件都会重复。但是,关键是我希望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和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是数据库中其他表的列名一样。这将拉出我需要的值,但现在我如何求它们并使总和等于一个新的测量条目?
最终编辑(希望): 这就是我现在正在使用的。那么相关的块。
select (cast(count(id) as float)) as Value, 'TotalPeople' as Measure
from table1
where FinalDisposition = 'Weekends' or FinalDisposition = 'Weekdays'
group by FinalDisposition
一切都有效,除了我的总和。我现在需要的是能够将值条目加在一起。
答案 0 :(得分: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
EDIT2: 我认为如果你想要完成同样的事情,解决方案基本上是一样的:
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'