按ID划分的SQL摘要,包含句点到期间的比较

时间:2010-11-07 09:24:49

标签: sql

我是SQL的初学者,希望有人可以帮助我:

我有一个项目类别表:

ItemID | ItemName | ItemCategory | Active/Inactive
100      Carrot      Veg           Yes
101      Apple       Fruit         Yes
102      Beef        Meat          No
103      Pineapple   Fruit         Yes

我有一张销售表:

Date       | ItemID | Sales
01/01/2010   100      50
05/01/2010   101      200
06/01/2010   101      250
06/01/2010   102      300
07/01/2010   103      50
08/01/2010   100      100
10/01/2010   102      250

如何按项目按期间(如下所示)(仅包含活动项目)

来实现销售汇总表
ItemID | ItemName | ItemCategory | (01/01/2010 – 07/01/2010) | (08/01/2010 – 14/01/1020)
100      Carrot     Veg             50                         100
101      Apple      Fruit          450                           0
103      Pineapple  Fruit            0                           0

2 个答案:

答案 0 :(得分:0)

一个非常脏的解决方案

SELECT s.ItemId, 
       (SELECT ItemName FROM Items WHERE ItemId = s.ItemId) ItemName, 
        ISNULL((SELECT Sum(Sales)FROM sales
            WHERE [Date] BETWEEN '2010/01/01' AND '2010/01/07'
            AND itemid = s.itemid
            GROUP BY ItemId),0)   as firstdaterange,
        ISNULL((SELECT Sum(Sales)FROM sales
            WHERE [Date] BETWEEN '2010/01/08' AND '2010/01/14'
            AND itemid = s.itemid
            GROUP BY ItemId), 0)   seconddaterange
FROM Sales s
INNER JOIN Items i ON s.ItemId = i.ItemId
WHERE i.IsActive = 'Yes'
GROUP BY s.ItemId 

同样是一个肮脏的解决方案,日期也是硬编码的。您可以将此转换为存储过程,将日期作为参数。

我对PIVOT命令并不太了解,但也许这值得谷歌。

答案 1 :(得分:0)

您可以使用SQL PIVOT运算符来旋转数据。不幸的是,由于需要预先指定输出列,该运算符的范围有限。

通常,您可以通过对计算列进行分组来实现此目的(在这种情况下,计算列的周数或每行的第一天)。然后,您可以使用SELECT DISTINCT week FROM result派生的列动态生成SQL,或者只是将结果放入Excel并使用其数据透视表工具。