通过“组头”动态分组

时间:2019-03-11 07:26:57

标签: sql sql-server tsql

有人可以帮助我解决这个问题。我有一个带有产品表,产品销售表。这是其中的一些屏幕截图。

Product table

Product sales table

现在,我想进行一个TSQL查询,该查询可以对它们进行分组并添加类似“标题描述”的内容? 像这样

Endproduct

如果它是一个相对动态的查询,那将是完美的。

有人可以在这里帮我还是给我一些小费?

3 个答案:

答案 0 :(得分:0)

尝试这个:

SELECT DISTINCT A.ProductName, B.Price 
FROM Product A 
INNER JOIN Product_Sales B ON A.ProductId = B.ProductId
GROUP BY ProductName, Price

答案 1 :(得分:0)

您可以在SQL Server中将GROUP BYGROUPING SETS一起使用以获取所需的输出。

SELECT CASE 
         WHEN groupname IS NOT NULL THEN groupname 
         WHEN groupname IS NULL 
              AND productname IS NULL THEN 'food' 
         ELSE productname 
       END          AS GroupName, 
       Sum(s.price) price 
FROM   product p 
       INNER JOIN TableSales s 
               ON p.productid = s.productid 
GROUP  BY grouping sets( ( p.productname ), ( p.groupname ), ( ) ) 

Online Demo

输出

+------------+-------+
| GroupName  | price |
+------------+-------+
| fruit      | 14    |
+------------+-------+
| vegetables | 52    |
+------------+-------+
| food       | 66    |
+------------+-------+
| Apple      | 5     |
+------------+-------+
| Capsicum   | 35    |
+------------+-------+
| Cucumber   | 17    |
+------------+-------+
| Orange     | 9     |
+------------+-------+

答案 2 :(得分:0)

我倾向于取消分类,然后汇总:

select which, name, sum(price)
from products p cross apply
     (values ('productName', productName),
             ('groupName', groupName),
             ('parentGroup', parentGroup)
     ) v(which, name) left join
     productsales ps
     on ps.productId = p.productId
group by which, name;