Bagaimana cara membuat satu kueri SQL agar memiliki nilai MTD dan YTD di baris yang sama?

pemrograman


Saya memiliki Crystal Report yang saat ini saya konversi ke SSRS. Laporan ini memiliki 3 kolom untuk MTD (nilai Bulan hingga Tanggal) dan 3 kolom untuk YTD (nilai Tahun hingga Tanggal). Saya dapat memisahkan 3 kolom tersebut tetapi untuk keakuratan data saya perlu menggabungkannya dalam satu pernyataan SQL untuk menghasilkan output dalam satu baris. Saya bisa mendekatinya menggunakan beberapa fungsi penggabungan di SQL. Masalahnya adalah saya tidak dapat menggunakan perintah grup demi dan membuat saya melakukan kesalahan. Apa yang harus saya edit dalam kueri SQL saya seperti yang ditunjukkan pada Crystal Report di bawah ini?
Kesalahan:

Msg 512, Level 16, State 1, Line 106
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Crystal Report saat ini yang saya ubah menjadi SSRS

EDIT : Saya baru saja membuat sampel dbfiddle : DB Fiddle – Taman Bermain Basis Data SQL[^]

Dalam Kode 2 saya telah mencoba menggunakan some with dan unions tetapi itu memberi saya beberapa kesalahan

Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.

Apa yang saya coba:

Kode 1

SQL
SET ARITHABORT OFF
SET ANSI_WARNINGS OFF
SELECT coalesce((Select ((SUM( "IS_vwSalesbyProductLineComp"."sls_amt")-SUM( "IS_vwSalesbyProductLineComp"."cost_amt"))/SUM( "IS_vwSalesbyProductLineComp"."sls_amt"))*100 ),0) AS G1MTD,
	   "IS_vwSalesbyProductLineComp"."Mainslspsn_name",
	   "IS_vwSalesbyProductLineComp"."PCSummarized",
	   coalesce ((SELECT SUM("IS_vwSalesbyProductLineComp"."qty_to_ship"-"IS_vwSalesbyProductLineComp"."qty_return_to_stk")FROM "100"."dbo"."IS_vwSalesbyProductLineComp"
   where Year = 2021
   and Month between 1 and 12 Group by Mainslspsn_name,PCSummarized),0) AS Qty_Sold,
	   coalesce ((SELECT SUM("IS_vwSalesbyProductLineComp"."sls_amt")FROM "100"."dbo"."IS_vwSalesbyProductLineComp"
   where Year = 2021
   and Month between 1 and 12 Group by Mainslspsn_name,PCSummarized),0) AS YTD_Sales,
	   coalesce ((SELECT SUM("IS_vwSalesbyProductLineComp"."cost_amt")FROM "100"."dbo"."IS_vwSalesbyProductLineComp"
   where Year = 2021
   and Month between 1 and 12 Group by Mainslspsn_name,PCSummarized),0) AS YTD_COGS,
	   coalesce((Select ((SUM( "IS_vwSalesbyProductLineComp"."sls_amt")-SUM( "IS_vwSalesbyProductLineComp"."cost_amt"))/SUM( "IS_vwSalesbyProductLineComp"."sls_amt"))*100 
	   FROM "100"."dbo"."IS_vwSalesbyProductLineComp"
   where Year = 2021
   and Month between 1 and 12 Group by Mainslspsn_name,PCSummarized),0) AS G2YTD,
		SUM("IS_vwSalesbyProductLineComp"."qty_to_ship"-"IS_vwSalesbyProductLineComp"."qty_return_to_stk") 
		AS Qty_Sold,
   		SUM("IS_vwSalesbyProductLineComp"."sls_amt") 
		AS MTD_Sales,
      	SUM("IS_vwSalesbyProductLineComp"."cost_amt") 
		AS MTD_COGS   
   FROM "100"."dbo"."IS_vwSalesbyProductLineComp"
   where Year = 2021
   and Month = 12
   Group by Mainslspsn_name,PCSummarized
   order by PCSummarized

Kode 2

SET ARITHABORT OFF
SET ANSI_WARNINGS OFF
WITH 
T1 AS
(
SELECT (
       SELECT((SUM(IS_vwSalesbyProductLineComp.sls_amt) - SUM(IS_vwSalesbyProductLineComp.cost_amt)) / SUM(IS_vwSalesbyProductLineComp.sls_amt)) * 100) AS G1MTD, 
       IS_vwSalesbyProductLineComp.Mainslspsn_name, 
       IS_vwSalesbyProductLineComp.PCSummarized, 
       (
       SELECT SUM(IS_vwSalesbyProductLineComp.qty_to_ship - IS_vwSalesbyProductLineComp.qty_return_to_stk)
       FROM "100".dbo.IS_vwSalesbyProductLineComp
       WHERE Year = 2021
             AND Month BETWEEN 1 AND 12
       GROUP BY Mainslspsn_name, 
                PCSummarized) AS Qty_Sold, 
       (
       SELECT SUM(IS_vwSalesbyProductLineComp.sls_amt)
       FROM "100".dbo.IS_vwSalesbyProductLineComp
       WHERE Year = 2021
             AND Month BETWEEN 1 AND 12
       GROUP BY Mainslspsn_name, 
                PCSummarized) AS YTD_Sales, 
      (
       SELECT SUM(IS_vwSalesbyProductLineComp.cost_amt)
       FROM "100".dbo.IS_vwSalesbyProductLineComp
       WHERE Year = 2021
             AND Month BETWEEN 1 AND 12
       GROUP BY Mainslspsn_name, 
                PCSummarized) AS YTD_COGS, 
       (
       SELECT((SUM(IS_vwSalesbyProductLineComp.sls_amt) - SUM(IS_vwSalesbyProductLineComp.cost_amt)) / SUM(IS_vwSalesbyProductLineComp.sls_amt)) * 100
       FROM "100".dbo.IS_vwSalesbyProductLineComp
       WHERE Year = 2021
             AND Month BETWEEN 1 AND 12
       GROUP BY Mainslspsn_name, 
                PCSummarized) AS G2YTD, 
       SUM(IS_vwSalesbyProductLineComp.qty_to_ship - IS_vwSalesbyProductLineComp.qty_return_to_stk) AS Qty_Sold2, --> renamed because ambigous
       SUM(IS_vwSalesbyProductLineComp.sls_amt) AS MTD_Sales, 
       SUM(IS_vwSalesbyProductLineComp.cost_amt) AS MTD_COGS
FROM "100".dbo.IS_vwSalesbyProductLineComp
WHERE Year = 2021
      AND Month = 12
GROUP BY Mainslspsn_name, 
         PCSummarized
),
T2 AS 
(
SELECT 0 AS C1, '' AS C2, '' AS C3, 0 AS C4, 0 AS C5, 0 AS C6, 0 AS C7, 0 AS C8, 0 AS C9, 0 AS C10
),
T3 AS
(
SELECT * FROM T1
UNION 
SELECT * FROM T2
)
SELECT SUM(G1MTD) AS G1MTD, 
   (SELECT [text()] = Mainslspsn_name
       FROM "100".dbo.IS_vwSalesbyProductLineComp 
       FOR XML 
           PATH(''),
           TYPE
   ).value
     (
         './text()[1]', 
         'nvarchar(max)'
     ),
   (SELECT [text()] = PCSummarized
       FROM "100".dbo.IS_vwSalesbyProductLineComp 
       FOR XML 
           PATH(''),
           TYPE
   ).value
     (
         './text()[1]', 
         'nvarchar(max)'
     ),
       SUM(Qty_Sold) AS Qty_Sold,
       SUM(YTD_Sales) AS YTD_Sales,
       SUM(YTD_COGS) AS YTD_COGS,
       SUM(G2YTD) AS G2YTD,
       SUM(Qty_Sold2) AS Qty_Sold2,
       SUM(MTD_Sales) AS MTD_Sales,
       SUM(MTD_COGS) AS MTD_COGS
FROM T3
GROUP BY Mainslspsn_name, 
         PCSummarized
ORDER BY PCSummarized;

Solusi 1

Jika tidak ada data sampel, mulailah dengan mengatasi poin-poin berikut.

— 100.dbo.IS_vwSalesbyProductLineComp bukan pengidentifikasi SQL yang valid. Pengidentifikasi SQL harus dimulai dengan huruf atau garis bawah

— Anda tidak perlu mengkualifikasi nama tabel di kolom jika hanya memilih dari satu tabel

— jika Anda ingin memenuhi syarat kolom maka gunakan alias alih-alih nama tabel lengkap untuk membuat skrip lebih mudah dibaca, misalnya daripada

SQL
select IS_vwSalesbyProductLineComp.sls_amt
from IS_vwSalesbyProductLineComp

menggunakan

SQL
select splc.sls_amt 
from IS_vwSalesbyProductLineComp splc

— hilangkan pembatas pada nama kolom dan tabel – hal tersebut tidak diperlukan dan hanya membuat kueri Anda tidak dapat dibaca

— Jika Anda menggunakan pembatas maka gunakanlah [ ] yaitu sebagai gantinya "IS_vwSalesbyProductLineComp" menggunakan [IS_vwSalesbyProductLineComp] – sekali lagi, ini lebih mudah dibaca

— pernyataanmu

Mengutip:

tetapi untuk keakuratan data saya perlu menggabungkannya dalam satu pernyataan SQL

tidak valid. Jumlah pernyataan SQL yang digunakan tidak berpengaruh apa pun terhadap keakuratan data. Terobsesi untuk memasukkan semuanya ke dalam satu pernyataan dapat merusak kejelasan, keakuratan (skrip Anda, bukan data) dan kinerja.

— sama sekali tidak diperlukan semua subkueri tersebut – ditambah lagi, seperti yang Anda lihat, Anda mendapatkan beberapa baris kembali

Dapatkan semua data yang Anda perlukan dalam baris terpisah – jika Anda bersikeras menjadikannya satu pernyataan SQL maka gunakan Common Table Expression (CTE – DENGAN common_table_expression (Transact-SQL) – SQL Server | Microsoft Dokumen[^] ).

Kemudian POROS hasil tersebut untuk mendapatkan tabel yang Anda inginkan – lihat Operator PIVOT SQL Server Dijelaskan Dengan Jelas Dengan Contoh Praktis[^]

Solusi 2

Sekilas… pertanyaan Anda sangat buruk:
Kesalahan yang paling penting adalah: terlalu banyak SELECT!
Anda punya 1 utama SELECT dan kemudian 4 sub-SELECT!

Cobalah untuk menulis ulang kueri Anda agar dapat menggunakan lebih sedikit SELECT.
Periksa setiap subkueri. Jika salah satu darinya mengembalikan lebih dari satu catatan, Anda harus meningkatkan kueri itu.

Sementara itu, silakan baca ini: Perbaiki Pesan 512 “Subquery mengembalikan lebih dari 1 nilai” di SQL Server[^]

Solusi 5

https://www.google.com/search?q=standale+to+Hometown+Water+Fire+Restoration
Namun postingan yang bagus, saya ingin tahu apakah Anda dapat menulis lebih banyak tentang subjek ini?
Saya akan sangat berterima kasih jika Anda dapat menjelaskan lebih lanjut.

Bersulang!

コメント

タイトルとURLをコピーしました