Sql server SQL SERVER如何在具有;分组方式;

Sql server SQL SERVER如何在具有;分组方式;,sql-server,vb.net,select,union,Sql Server,Vb.net,Select,Union,我想在具有group by的同一个表上组合两个查询。 这是我的桌子: Date##### | Value1 | Value2 | Value3 | Type 23/04/2014 | 1,2 | 12,3 | 10 | Green 23/04/2014 | 11,2 | 3 | 10,3 | Non-Green 24/04/2014 | 10,9 | 3 | 11 | Green

我想在具有group by的同一个表上组合两个查询。 这是我的桌子:

 Date#####   |  Value1 |  Value2 |   Value3 | Type
 23/04/2014  |  1,2    |    12,3 |    10    | Green
 23/04/2014  |  11,2   |    3    |   10,3   | Non-Green    
 24/04/2014  |  10,9   |    3    |    11    | Green
 24/04/2014  |  2,3    |    12,3 |    8     | Green
 25/04/2014  |  10     |    2    |   10,8   | Non-Green    
 25/04/2014  |  1,4    |    5    |    12    | Green
我希望它显示:

 Date#####   | Count |Type
 23/04/2014  |  2    | Green
 23/04/2014  |  2    | Non-Green
 24/04/2014  |  3    | Green
 25/04/2014  |  2    | Non-Green
 25/04/2014  |  1    | Green
这是我的第一个问题:

Dim strCommand As String = "SELECT d, LW, cnt FROM(SELECT TOP 7 [date] AS d, [Type] as LW, SUM(CASE WHEN ManualAssists1 >= 10 THEN 1 ELSE 0 END + CASE WHEN ManualAssists2 >= 10 THEN 1 ELSE 0 END + CASE WHEN ManualAssists3 >= 10 THEN 1 ELSE 0 END) AS cnt FROM tbBooth where Type = 'Green' GROUP BY [date],[Type] ORDER BY [date] DESC) x ORDER BY d ASC"
它显示:

 Date#####   | Count |Type
 23/04/2014  |  2    | Green
 24/04/2014  |  3    | Green
 25/04/2014  |  1    | Green
 Date#####   | Count |Type
 23/04/2014  |  2    | Non-Green
 25/04/2014  |  2    | Non-Green
我的第二个问题:

Dim strCommand As String = "SELECT d, LW, cnt FROM(SELECT TOP 7 [date] AS d, [Type] as LW, SUM(CASE WHEN ManualAssists1 >= 10 THEN 1 ELSE 0 END + CASE WHEN ManualAssists2 >= 10 THEN 1 ELSE 0 END + CASE WHEN ManualAssists3 >= 10 THEN 1 ELSE 0 END) AS cnt FROM tbBooth where Type = 'Non-Green' GROUP BY [date],[Type] ORDER BY [date] DESC) x ORDER BY d ASC"
它显示:

 Date#####   | Count |Type
 23/04/2014  |  2    | Green
 24/04/2014  |  3    | Green
 25/04/2014  |  1    | Green
 Date#####   | Count |Type
 23/04/2014  |  2    | Non-Green
 25/04/2014  |  2    | Non-Green
我想将这两个查询合并为一个查询,并获取日期、绿色结果和非绿色结果。假设我有很多组日期,我希望它仅显示基于
ASC
顺序的最后7组日期。我尝试在两个查询之间添加联合。以下是我目前的代码:

Dim strCommand As String = "Select 'Test1', * from tbBooth where type ='Green' and exist(SELECT d, LW, cnt FROM(SELECT TOP 7 [date] AS d, [Type] as LW, SUM(CASE WHEN Value1 >= 10 THEN 1 ELSE 0 END + CASE WHEN Value2 >= 10 THEN 1 ELSE 0 END + CASE WHEN Value3 >= 10 THEN 1 ELSE 0 END) AS cnt FROM tbBooth GROUP BY [date],[Type] ORDER BY [date] DESC) x ORDER BY d ASC) Union Select 'Test2', * from tbBooth where type ='Non-Green' and exist(SELECT d, LW, cnt FROM(SELECT TOP 7 [date] AS d, [Type] as LW, SUM(CASE WHEN Value1 >= 10 THEN 1 ELSE 0 END + CASE WHEN Value2 >= 10 THEN 1 ELSE 0 END + CASE WHEN Value3 >= 10 THEN 1 ELSE 0 END) AS cnt FROM tbBooth GROUP BY [date],[Type] ORDER BY [date] DESC) x ORDER BY d ASC)
它给了我一个错误,关键字“SELECT”附近的语法不正确。 怎么做呢?我试着去看其他的SO帖子,但我没有任何线索去做,因为我的两个查询都很复杂


感谢您的改进……

这并不是因为您的组合查询很复杂,只是它错了

我不明白的是为什么你有WHERE类型='Green'和'Non-Green'。 考虑到您想要的结果,您可以将其从何处移除,并获得您想要的:

SELECT  d ,
        LW ,
        cnt
FROM    ( SELECT TOP 7
                    [date] AS d ,
                    [Type] AS LW ,
                    SUM(CASE WHEN ManualAssists1 >= 10 THEN 1
                             ELSE 0
                        END + CASE WHEN ManualAssists2 >= 10 THEN 1
                                   ELSE 0
                              END + CASE WHEN ManualAssists3 >= 10 THEN 1
                                         ELSE 0
                                    END) AS cnt
          FROM      tbBooth
          --WHERE     Type = 'Green'
          GROUP BY  [date] ,
                    [Type]
          ORDER BY  [date] DESC
        ) x
ORDER BY d ASC
其中:

2014-04-23  Green   2
2014-04-23  Non-Green   2
2014-04-24  Green   3
2014-04-25  Green   1
2014-04-25  Non-Green   2

当两个查询除了WHERE?

Bro中的“Type”之外都相同时,我认为没有必要“组合”这两个查询,在您的代码中将
exist
更改为
exists
:)这应该行得通

更新: 添加
Top7
以选择

Select 'Test1', * from tbBooth 
where type ='Green' and exists(SELECT **top 7** d, LW, cnt FROM(SELECT TOP 7 [date] AS d,
 [Type] as LW, 
 SUM(CASE WHEN Value1 >= 10 THEN 1 ELSE 0 END 
    + CASE WHEN Value2 >= 10 THEN 1 ELSE 0 END 
    + CASE WHEN Value3 >= 10 THEN 1 ELSE 0 END) AS cnt 
FROM tbBooth GROUP BY [date],[Type] 
ORDER BY [date] DESC) x ORDER BY d ASC) 
Union 
Select 'Test2', * from tbBooth where type ='Non-Green' 
and exists(SELECT **top 7** d, LW, cnt FROM(SELECT TOP 7 
[date] AS d, [Type] as LW, SUM(CASE WHEN Value1 >= 10 THEN 1 ELSE 0 END 
+ CASE WHEN Value2 >= 10 THEN 1 ELSE 0 END 
+ CASE WHEN Value3 >= 10 THEN 1 ELSE 0 END) AS cnt 
FROM tbBooth GROUP BY [date],[Type] ORDER BY [date] DESC) x ORDER BY d ASC)

是的,你是对的,但实际上我想把绿色类型和非绿色类型作为别名。我想让它变成一组绿色的数据或一组非绿色的数据,这样我就可以调用它并把它放在我的图表上……我不明白你在追求什么?如果要合并结果,请在不使用WHERE的情况下运行它;如果只需要一个,那么在这种情况下添加WHERE,如果需要多个类型,那么在WHERE中添加所有需要的类型?感谢您的更正,但它仍然给我一个错误,它说:ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效,除非还指定了TOP或FOR XML。您是否可以检查更新后的答案,将
TOP 7
添加到您的选择我尝试了您的代码,它可以执行,但不会在我的图表中显示任何内容。。我在图表中调用了d、Test1和Test2……嗨,兄弟,你能提供准确的列名和数据吗?因为它对你的查询没有意义,我真的不明白你是如何用逗号求和的~它们是十进制类型…所以你的逗号是指小数点,对吗?可以