rikidev Ответов: 1

SQL-сервер заказа в объявлении таблица не правильная


Я сделал этот запрос на sql server 2014, дело в том, что я должен правильно упорядочить результат запроса, первые две строки вывода запроса (ниже) являются правильными, в то время как начиная с третьей строки поля DescrizioneDis, CostoUnitario e Quantita, я вставляю в четвертую строку вместо третьей, я не могу понять, где я ошибаюсь? Я ввел запрос ниже, неправильный результат видео, результат, который я хотел бы получить, и структуры таблиц!

Изображение неправильного результата
Изображение правильного результата(который я должен получить)

Я бы хотел получить такой результат

SQL Create Table of Capitolo:
CREATE TABLE [dbo].[Capitolo](
    [IdCapitolo] [int] IDENTITY(1,1) NOT NULL,
    [IdPreventivo] [int] NULL,
    [NumeroCapitolo] [int] NULL,
    [Descrizione] [varchar](5000) NOT NULL,
    [Ricarico] [money] NULL,
    [Modificaincorso] [varchar](100) NULL,
    [Tipologia] [varchar](20) NULL,
    [PrezzoRiservato] [money] NULL,
PRIMARY KEY CLUSTERED 
(
    [IdCapitolo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


SQL Create Table of SottoCapitolo:
CREATE TABLE [dbo].[SottoCapitolo](
    [IdSottoCapitolo] [int] IDENTITY(1,1) NOT NULL,
    [IdCapitolo] [int] NULL,
    [Tipo] [varchar](500) NULL,
    [Codice] [varchar](500) NULL,
    [CodiceDistinta] [int] NULL,
    [Descrizione] [varchar](5000) NULL,
    [DescrizioneEstesa] [varchar](5000) NULL,
    [UnitaMisura] [varchar](10) NULL,
    [SottoCapitolo1] [varchar](100) NULL,
    [SottoCapitolo2] [varchar](100) NULL,
    [SottoCapitolo3] [varchar](100) NULL,
    [Note] [varchar](1000) NULL,
    [RicaricoManodopera] [float] NULL,
    [Quantita] [int] NULL,
    [CostoUnitario] [money] NULL,
    [Images] [varbinary](max) NULL,
    [PrezzoListino] [money] NULL,
PRIMARY KEY CLUSTERED 
(
    [IdSottoCapitolo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [Tipo]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [Codice]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [CodiceDistinta]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [Descrizione]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [DescrizioneEstesa]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [UnitaMisura]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [SottoCapitolo1]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [SottoCapitolo2]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [SottoCapitolo3]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [Note]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT ((0)) FOR [RicaricoManodopera]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [Quantita]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [CostoUnitario]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [Images]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT ((0)) FOR [PrezzoListino]
GO

ALTER TABLE [dbo].[SottoCapitolo]  WITH CHECK ADD FOREIGN KEY([IdCapitolo])
REFERENCES [dbo].[Capitolo] ([IdCapitolo])
GO


Что я уже пробовал:

Теперь это мой вопрос:
DECLARE @T AS TABLE (
  Descrizione varchar(5000),
  NumeroCapitolo varchar(100),
  SottoCapitolo1 varchar(5000),
  SottoCapitolo2 varchar(5000),
  SottoCapitolo3 varchar(5000),
  Totale money,
  DescrizioneEstesa varchar(5000),
  Images image,
  CostoUnitario money,
  Quantita money,
  DescrizioneDis varchar(5000),
  Tipologia varchar(300),
  PrezzoRiservato money,
  UM varchar(50)
);
INSERT INTO @T
  SELECT
    Capitolo.Descrizione,
    Capitolo.NumeroCapitolo,
    SottoCapitolo.SottoCapitolo1,
    SottoCapitolo.SottoCapitolo2,
    SottoCapitolo.SottoCapitolo3,
    (ROUND(((((ROUND((((((((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) + SottoCapitolo.CostoUnitario) / 100) * Capitolo.Ricarico) + (((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) + SottoCapitolo.CostoUnitario)) * 1), 2)) / 100) * PercentualeMargine) + (ROUND((((((((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) + SottoCapitolo.CostoUnitario) / 100) * Capitolo.Ricarico) + (((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) + SottoCapitolo.CostoUnitario)) * 1), 2))), 2)) * SottoCapitolo.Quantita AS Totale,
    SottoCapitolo.DescrizioneEstesa,
    SottoCapitolo.Images,
    ROUND(((((ROUND((((((((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) + SottoCapitolo.CostoUnitario) / 100) * Capitolo.Ricarico) + (((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) + SottoCapitolo.CostoUnitario)) * 1), 2)) / 100) * PercentualeMargine) + (ROUND((((((((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) + SottoCapitolo.CostoUnitario) / 100) * Capitolo.Ricarico) + (((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) + SottoCapitolo.CostoUnitario)) * 1), 2))), 2) AS CostoUnitario,
    SottoCapitolo.Quantita,
    CASE
      WHEN Tipologia = 'Prezzo' THEN SottoCapitolo.Descrizione
      ELSE '' + SottoCapitolo.Codice + '     ' + SottoCapitolo.Descrizione
    END AS DescrizioneDis,
    Capitolo.Tipologia,
    Capitolo.PrezzoRiservato,
    SottoCapitolo.UnitaMisura AS UM
  FROM Capitolo
  INNER JOIN SottoCapitolo
    ON SottoCapitolo.IdCapitolo = Capitolo.IdCapitolo
  INNER JOIN Preventivo
    ON Preventivo.IdPreventivo = Capitolo.IdPreventivo
  WHERE Preventivo.IdPreventivo = '196';
SELECT
  CASE
    WHEN ROW_NUMBER()
      OVER (PARTITION BY a.Descrizione ORDER BY a.Descrizione) = 1 THEN a.Descrizione
    ELSE ''
  END AS Descrizione,
  a.NumeroCapitolo,
  a.SottoCapitolo1,
  a.SottoCapitolo2,
  a.SottoCapitolo3,
  a.DescrizioneDis,
  a.CostoUnitario,
  a.Quantita,
  a.Totale AS TotaleCap,
  a.DescrizioneEstesa,
  a.Images,
  a.Tipologia,
  a.PrezzoRiservato,
  a.UM
FROM (SELECT
  1 AS d,
  ROW_NUMBER() OVER (PARTITION BY Descrizione ORDER BY Descrizione) AS r,
  Descrizione,
  NumeroCapitolo,
  SottoCapitolo1,
  SottoCapitolo2,
  SottoCapitolo3,
  Totale,
  DescrizioneDis,
  Images,
  CostoUnitario,
  Quantita,
  DescrizioneEstesa,
  Tipologia,
  PrezzoRiservato,
  UM
FROM @T
UNION ALL
SELECT
  2,
  0,
  Descrizione,
  NumeroCapitolo,
  '',
  '',
  '',
  SUM(Totale),
  '',
  '',
  '',
  '',
  '',
  Tipologia,
  PrezzoRiservato,
  ''
FROM @T
GROUP BY NumeroCapitolo,
         Descrizione,
         PrezzoRiservato,
         Tipologia) AS a
ORDER BY NumeroCapitolo

RDBurmon

какая ошибка? вы можете вставить подробное сообщение об ошибке здесь?

rikidev

Я выразился плохо, это не дает мне ошибок, проблема в том, что я ошибаюсь в упорядочении результатов в запросе! должен дать мне результат, который присутствует на изображении: https://i.stack.imgur.com/SnM39.jpg

RDBurmon

это снимок экрана Вашего управления GridView? bcz я вижу, что порядок правильный в соответствии со значениями в NumeroCapitolo (1,1,2,2)

rikidev

тогда мой блик заключается в том, что на первом изображении проблема заключается в том, что единственными строками в правильном выводе являются первая и вторая, третья показывает поля, отмеченные зеленым цветом (на втором изображении) в строке 4, а не в третьей

Tomas Takac

Вы указали " заказ по NumeroCapitolo`, и вот что вы получили. Если вы хотите другой заказ, вам нужно изменить свой заказ по заявлению.

rikidev

Точно, я не знаю, как изменить порядок так, чтобы строка 3 имела (DescrizioneDis,CostoUnitario e Quantita), кроме пустой

Tomas Takac

К сожалению, NULL рассматривается SQL Server как наименьшее значение. Вот несколько обходных путей: Того, SQL-сервер, дата и обнуляет последний - переполнение стека[^]

rikidev

Я читал, что там написано в ссылке, но не понял, как применить ее к моему запросу!

1 Ответов

Рейтинг:
6

Member 7870345

Привет:
Боюсь, что я не совсем понимаю, в чем проблема, но я думаю, что если вы замените

Order by NumeroCapitolo

около
Order by NunmeroCapitolo, 
CASE  ( (DescrizioneDis IS NULL)  OR DescrizioneDis='') AND CostoUnitario=0 AND Quantita=0 THEN 1 ELSE 0 END 

затем в том же NumeroCapitulo вы можете увидеть строки, упорядоченные в следующем порядке:

- сначала (значение 0) все Рау, которые не помещаются в следующем абзаце
- last (значение 1) все RAW, которые описываются в DescrizioneDis, CostoUnitario и Quantita, пусты


Извините, если я не понял, что вы имеете в виду.


rikidev

Я уже пробовал этот тип решения, но он не работает, извините,но я не могу правильно объяснить, я опубликовал здесь изображение результата, который я должен получить: https://imgur.com/qBE4Qh4

Member 7870345

Я сделал поправку в своем предыдущем ответе в надежде помочь вам

rikidev

Я пробовал с решением, которое вы написали, но оно не работает должным образом, если я это сделаю, то переверну первое со вторым