Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Хитрый запрос  [new]
Gena928
Member

Откуда: Москва
Сообщений: 1139
Добрый день,
Задача на планирование производства.

Есть табличка с 2 полями: [НомерДетали] и [Сценарий производства].
 /****** Object:  Table [dbo].[TestTable]    Script Date: 06/30/2011 10:09:14 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[TestTable](
	[DetailNumber] [uniqueidentifier] NOT NULL,
	[ProductionScenario] [tinyint] NULL,
 CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED 
(
	[DetailNumber] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[TestTable] ADD  CONSTRAINT [DF_TestTable_DetailNumber]  DEFAULT (newid()) FOR [DetailNumber]
GO

Сценарий может быть:
- единичка (пессимистический сценарий производства);
- двоечка (нормальный сценарий производства);
- тройка (оптимистический сценарий производства);

Количество произведенных деталей:
[пессимистический сценарий] = [пессимистический сценарий]
[нормальный сценарий] = [пессимистический сценарий] + [нормальный сценарий]
[оптимистический сценарий] = [пессимистический сценарий] + [нормальный сценарий] + [оптимистический сценарий]


-- Добавляем 5 деталей для пессимистического сценария производства
INSERT INTO TestTable (ProductionScenario) VALUES (1)
INSERT INTO TestTable (ProductionScenario) VALUES (1)
INSERT INTO TestTable (ProductionScenario) VALUES (1)
INSERT INTO TestTable (ProductionScenario) VALUES (1)
INSERT INTO TestTable (ProductionScenario) VALUES (1)

-- В случае нормального сценария, будет произведено еще 6 деталей (всего 11)
INSERT INTO TestTable (ProductionScenario) VALUES (2)
INSERT INTO TestTable (ProductionScenario) VALUES (2)
INSERT INTO TestTable (ProductionScenario) VALUES (2)
INSERT INTO TestTable (ProductionScenario) VALUES (2)
INSERT INTO TestTable (ProductionScenario) VALUES (2)
INSERT INTO TestTable (ProductionScenario) VALUES (2)

-- В случае оптимистического сценария, будет произведено еще 6 деталей (всего 17)
INSERT INTO TestTable (ProductionScenario) VALUES (3)
INSERT INTO TestTable (ProductionScenario) VALUES (3)
INSERT INTO TestTable (ProductionScenario) VALUES (3)
INSERT INTO TestTable (ProductionScenario) VALUES (3)
INSERT INTO TestTable (ProductionScenario) VALUES (3)
INSERT INTO TestTable (ProductionScenario) VALUES (3)

Задача: получить табличку вида

Тип сценария Количество
Pessimistic 5
Normal 11
Optimistic 17


Одним запросом у меня не получается. Только через хранимку, с созданием табличной переменной и поочередной вставкой строк.
Может у кого-то из уважаемых гуру форума это получится?
30 июн 11, 10:22    [10897358]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый запрос  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Gena928, а как вы различите, что TestTable (ProductionScenario) относится к какому-то определеному сценарию? ИМХО у вас не хватает поля признака сценария.
30 июн 11, 10:25    [10897380]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
Нарастающий итог что ли ?
30 июн 11, 10:26    [10897394]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый запрос  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
kDnZP
Gena928, а как вы различите, что TestTable (ProductionScenario) относится к какому-то определеному сценарию? ИМХО у вас не хватает поля признака сценария.

Блин, стормозил))), это у вас и есть походу признак.
30 июн 11, 10:27    [10897397]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый запрос  [new]
Gena928
Member

Откуда: Москва
Сообщений: 1139
kDnZP
Gena928, а как вы различите, что TestTable (ProductionScenario) относится к какому-то определеному сценарию? ИМХО у вас не хватает поля признака сценария.


Вот так вот:

Сценарий может быть:
- единичка (пессимистический сценарий производства);
- двоечка (нормальный сценарий производства);
- тройка (оптимистический сценарий производства);

То есть, если ProductionScenario = 1, то это пессимистический сценарий, ProductionScenario = 2 это нормальный сценарий, ProductionScenario = 3 это оптимистический сценарий.
30 июн 11, 10:28    [10897405]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый запрос  [new]
Gena928
Member

Откуда: Москва
Сообщений: 1139
Glory
Нарастающий итог что ли ?


ага.
30 июн 11, 10:29    [10897410]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый запрос  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Gena928, а SUM(CASE ...) вам уже не подходит?
30 июн 11, 10:29    [10897411]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый запрос  [new]
-=DiM@n=-
Member

Откуда: Москва
Сообщений: 1564
SELECT 'Pessimistic', COUNT(*)
FROM [dbo].[TestTable]
WHERE ProductionScenario = 1
UNION ALL
SELECT 'Normal', COUNT(*)
FROM [dbo].[TestTable]
WHERE ProductionScenario <= 2
UNION ALL
SELECT 'Optimistic', COUNT(*)
FROM [dbo].[TestTable]
WHERE ProductionScenario <= 3
30 июн 11, 10:30    [10897430]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый запрос  [new]
Gena928
Member

Откуда: Москва
Сообщений: 1139
-=DiM@n=-
SELECT 'Pessimistic', COUNT(*)
FROM [dbo].[TestTable]
WHERE ProductionScenario = 1
UNION ALL
SELECT 'Normal', COUNT(*)
FROM [dbo].[TestTable]
WHERE ProductionScenario <= 2
UNION ALL
SELECT 'Optimistic', COUNT(*)
FROM [dbo].[TestTable]
WHERE ProductionScenario <= 3


да, спасибо.
либо вот так (SUM(CASE...))

SELECT 
(SELECT COUNT([DetailNumber]) FROM TestTable WHERE ProductionScenario = 1) as FieldNeeded1,
(SELECT COUNT([DetailNumber]) FROM TestTable WHERE ProductionScenario <= 2) as FieldNeeded2,
(SELECT COUNT([DetailNumber]) FROM TestTable WHERE ProductionScenario <= 3) as FieldNeeded3

Одна голова хорошо, а с мозгами лучше )))
30 июн 11, 10:33    [10897444]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый запрос  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Gena928, так всеж короче:
SELECT  SUM(CASE WHEN ProductionScenario=1 THEN 1 END)
,SUM(CASE WHEN ProductionScenario<=2 THEN 1 END)
,SUM(CASE WHEN ProductionScenario<=3 THEN 1 END)
FROM    @TestTable
:)
30 июн 11, 10:37    [10897476]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый запрос  [new]
-=DiM@n=-
Member

Откуда: Москва
Сообщений: 1564
че-т формат выходных данных не совпадает )
автор
Тип сценария Количество
Pessimistic 5
Normal 11
Optimistic 17
30 июн 11, 10:38    [10897495]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый запрос  [new]
Gena928
Member

Откуда: Москва
Сообщений: 1139
-=DiM@n=-,

да, я просто с (SUM(CASE...)) извращался. Конечно

 SELECT 'Pessimistic', COUNT(*)
FROM [dbo].[TestTable]
WHERE ProductionScenario = 1
UNION ALL
SELECT 'Normal', COUNT(*)
FROM [dbo].[TestTable]
WHERE ProductionScenario <= 2
UNION ALL
SELECT 'Optimistic', COUNT(*)
FROM [dbo].[TestTable]
WHERE ProductionScenario <= 3 
правильней
30 июн 11, 10:45    [10897556]     Ответить | Цитировать Сообщить модератору
 Re: Хитрый запрос  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
-=DiM@n=-, это у меня с внимательностью проблемы ;). Сначала делаю, потом думаю.
30 июн 11, 10:50    [10897600]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить