SQL-запрос для отображения продаж продукта - PullRequest
0 голосов
/ 27 июня 2010

У меня есть таблица продаж, которая состоит из ItemSize, GroupName, Количество, ProductID и т. Д.

Теперь я хочу отобразить продажи в следующем формате

GroupName   ItemSize  Quantity   ItemSize  Quantity

означает

BEER    350ml   500    650ml   1000 

Как мне добиться этого в SQL SERVER 2005 EXPRESS (T-SQL)? Спасибо

ОБНОВЛЕНИЕ:

это моя структура таблицы продаж

CREATE TABLE [dbo].[SalesLog](
[SalesID] [int] IDENTITY(1,1) NOT NULL,
[MemoNo] [int] NULL,
[ProductCode] [int] NULL,
[Quantity] [int] NULL,
[Price] [int] NULL,
[ProductGroup] [int] NULL,
    CONSTRAINT [PK_SalesLog] PRIMARY KEY CLUSTERED 
    (
        [SalesID] ASC
    ) WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

структура таблицы "Мой продукт"

CREATE TABLE [dbo].[Products](
[ProductId] [int] IDENTITY(1,1) NOT NULL,
[pName] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[pSize] [int] NULL,
[pPrice] [int] NULL,
[pPackQty] [int] NULL,
[pGroup] [int] NULL,
[pCode] [int] NULL,
[pStock] [int] NULL,
[pYrStock] [int] NULL,
[pClearStock] [int] NULL,
    CONSTRAINT [PK_Products] PRIMARY KEY CLUSTERED 
   (
   [ProductId] ASC
   ) WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

Ответы [ 2 ]

3 голосов
/ 28 июня 2010

Вы можете агрегировать данные, используя операторы SUM и CASE.

Используя ваши определения таблиц (и некоторые очень минимальные составные данные), вот пример того, как вы можете это сделать:

--** Create test tables
DECLARE @SalesLog TABLE ( 
SalesID int IDENTITY(1,1) NOT NULL, 
MemoNo int NULL, 
ProductCode int NULL, 
Quantity int NULL, 
Price int NULL, 
ProductGroup int NULL)

DECLARE @Products TABLE( 
ProductId int IDENTITY(1,1) NOT NULL, 
pName nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
pSize int NULL, 
pPrice int NULL, 
pPackQty int NULL, 
pGroup int NULL, 
pCode int NULL, 
pStock int NULL, 
pYrStock int NULL, 
pClearStock int NULL)

--** Setup test data
INSERT INTO @SalesLog ( MemoNo, ProductCode, Quantity, Price, ProductGroup)
SELECT   0, 1, 500, 0, 1 UNION
SELECT   0, 2, 700, 0, 1 UNION   
SELECT   0, 2, 333, 0, 1 UNION   
SELECT   0, 3, 200, 0, 2 UNION
SELECT   0, 4, 125, 0, 2 ;

INSERT INTO @Products (pName, pSize, pPrice, pPackQty, pGroup, pCode, pStock, pYrStock, pClearStock)
SELECT 'Beer', 350, 1 , 1, 1, 1, 0, 0, 0 UNION
SELECT 'Beer', 650, 1 , 1, 1, 2, 0, 0, 0 UNION
SELECT 'Beer', 1000, 1 , 1, 1, 3, 0, 0, 0 UNION
SELECT 'Wine', 750, 1 , 1, 2, 4, 0, 0, 0 UNION 
SELECT 'Wine', 1000, 1 , 1, 2, 5, 0, 0, 0 ;

--** Example query
SELECT t.pName AS 'Product'
     , MAX(CASE WHEN t.Col = 1 THEN t.pSize END) AS 'Item Size'
     , ISNULL(SUM(CASE WHEN t.Col = 1 THEN t.Quantity END),0) AS 'Quantity'
     , MAX(CASE WHEN t.Col = 2 THEN t.pSize END) AS 'Item Size'
     , ISNULL(SUM(CASE WHEN t.Col = 2 THEN t.Quantity END),0) AS 'Quantity'
     , MAX(CASE WHEN t.Col = 3 THEN t.pSize END) AS 'Item Size'
     , ISNULL(SUM(CASE WHEN t.Col = 3 THEN t.Quantity END),0) AS 'Quantity'
FROM (
SELECT pName
     , pCode
     , pGroup
     , pSize
     , sl.Quantity
     , DENSE_RANK() OVER(PARTITION BY p.pGroup ORDER BY p.pSize) AS Col
  FROM @Products AS p
  LEFT JOIN @SalesLog AS sl
    ON p.pGroup = sl.ProductGroup
   AND p.pCode = sl.ProductCode
     ) AS t
 GROUP BY t.pGroup
     , t.pName
;   

Запрос использует функцию DENSE_RANK, чтобы сгруппировать элементы размера вместе и упорядочить их в порядке сборки размера, и это используется для определения того, в какой столбец должны быть записаны данные.

Хотя естьявляется оператором PIVOT в SQL Server 2005 и более поздних версиях, он не очень полезен, если у вас разные типы заголовков столбцов (в данном случае размер и количество элементов).

Вам нужно будет выбрать максимальное количестворазмеры продукта, о которых вы хотите сообщить, так как это жестко запрограммировано в запросе.Таким образом, если максимальное количество размеров продукта составляет 3, вы кодируете запрос, как показано выше.Однако, если один из ваших продуктов имеет 4 разных размера, вы собираетесь добавить дополнительную пару столбцов «Размер элемента и количество» для t.Col = 4 и т. Д.

Надеюсь, это поможет.

1 голос
/ 27 июня 2010

Похоже, вы пытаетесь создать таблицу PIVOT, где разные размеры элементов представлены в виде разных столбцов, а не строк. Взгляните на http://msdn.microsoft.com/en-us/library/ms177410.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...