尝试为不同的软件版本获取不同文件的不同值的总和

时间:2014-12-03 17:23:50

标签: sql-server database sql-server-2008 union aggregate-functions

我在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

一切都有效,除了我的总和。我现在需要的是能够将值条目加在一起。

1 个答案:

答案 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'