简体   繁体   English

在SQL查询中对多个选择进行分组

[英]Grouping multiple selects within a SQL query

I have a table Supplier with two columns, TotalStock and Date. 我有一个供应商,有两列,TotalStock和Date。 I'm trying to write a single query that will give me stock totals by week / month / year for a list of suppliers. 我正在尝试编写一个单独的查询,它将按周/月/年为库存总数提供供应商列表。

So results will look like this.. 所以结果看起来像这样......

SUPPLIER  WEEK MONTH YEAR
SupplierA 50   100   2000
SupplierB 60   150   2500
SupplierC 15   25    200

So far I've been playing around with multiple selects but I can't get any further than this: 到目前为止,我一直在玩多个选择,但我不能比这更进一步:

SELECT Supplier,
    (
    SELECT      Sum(TotalStock)
    FROM        StockBreakdown
    WHERE       Date >= '2014-5-12'
    GROUP BY    Supplier
    ) AS StockThisWeek,
    (
    SELECT      Sum(TotalStock)
    FROM        StockBreakdown
    WHERE       Date >= '2014-5-1'
    GROUP BY    Supplier
    ) AS StockThisMonth,
    (
    SELECT      Sum(TotalStock)
    FROM        StockBreakdown
    WHERE       Date >= '2014-1-1'
    GROUP BY    Supplier
    ) AS StockThisYear

This query throws an error as each individual grouping returns multiple results. 当每个单独的分组返回多个结果时,此查询会引发错误。 I feel that I'm close to the solution but can't work out where to go 我觉得我很接近解决方案,但无法解决问题

You don't have to use subqueries to achieve what you want : 您不必使用子查询来实现您想要的:

SELECT Supplier
     , SUM(CASE WHEN Date >= CAST('2014-05-12' as DATE) THEN TotalStock END) AS StockThisWeek
     , SUM(CASE WHEN Date >= CAST('2014-05-01' as DATE) THEN TotalStock END) AS StockThisMonth
     , SUM(CASE WHEN Date >= CAST('2014-01-01' as DATE) THEN TotalStock END) AS StockThisYear
FROM  StockBreakdown
GROUP BY Supplier

You may need to make the selects for the columns return only a single result. 您可能需要使列的选择仅返回单个结果。 You could try this (not tested currently): 你可以尝试这个(目前未测试):

SELECT Supplier,
(
    SELECT TOP 1 StockThisWeek FROM
    (
       SELECT      Supplier, Sum(TotalStock) AS StockThisWeek
       FROM        StockBreakdown
       WHERE       Date >= '2014-5-12'
       GROUP BY    Supplier
    ) tmp1
    WHERE tmp1.Supplier = Supplier 
) AS StockThisWeek,

(
    SELECT TOP 1 StockThisMonth FROM
    (
       SELECT      Supplier, Sum(TotalStock) AS StockThisMonth
       FROM        StockBreakdown
       WHERE       Date >= '2014-5-1'
       GROUP BY    Supplier
    ) tmp2
    WHERE tmp2.Supplier = Supplier 
) AS StockThisMonth, 

...

This selects the supplier and then tries to create two columns StockThisWeek and StockThisMonth by selecting the first entry from the select you created before. 这将选择供应商,然后通过从之前创建的选择中选择第一个条目,尝试创建两列StockThisWeekStockThisMonth As through the GROUP BY there should only be one entry per supplier, so you don't lose and data. 通过GROUP BY ,每个供应商应该只有一个条目,因此您不会丢失和数据。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM