Mysql chọn số lượng vào biến

Tôi đang cố gắng cập nhật/chèn vào bảng dựa trên số lượng cột cụ thể. Nếu số lượng (COL1) là> 1 hoặc <1 hoặc =1 thì dựa vào đó, nó sẽ được sao chép sang bảng khác. vì vậy đã viết mã bên dưới trong đó tất cả các kiểu dữ liệu là VARCHAR ngoại trừ cột ngày

KHAI BÁO @CNT INT
CHỌN @CNT = CNT TỪ
(
CHỌN ĐẾM (T1. [Retails]) CNT
TỪ [DBO]. [TABLE1] T1
THAM GIA [DBO]. BẢNG2 T2
TRÊN DƯỚI(T2. Sản phẩm]) = LOWER(T1. Sản phẩm)
Ở ĐÂU T1. [Bán lẻ] <> ' ' AND (T1. Sản phẩm) <> ' '
AND T1. [DATE1] >= DATEADD(MONTH, -3, GETDATE())
AND T1. [DATE1] < GETDATE()
NHÓM THEO T1. [Bán lẻ]
) BẢNG PHÁT SINH

NẾU @CNT = 1 THÌ
CẬP NHẬT [DBO]. TABLE2
SET [Retails] = (SELECT T2. [Bán lẻ] TỪ [DBO]. [TABLE1] T1
THAM GIA [DBO]. BẢNG2 T2
TRÊN DƯỚI(T2. Sản phẩm]) = LOWER(T1. Sản phẩm)
Ở ĐÂU T1. [Bán lẻ] <> ' ' AND (T1. Sản phẩm) <> ' '
AND T1. [DATE1] >= DATEADD(MONTH, -3, GETDATE())
AND T1. [DATE1] < GETDATE()

Mysql chọn số lượng vào biến

Nhưng mặc dù @CNT = 1 trong điều kiện if đang có thêm vài hàng, các hàng bổ sung, trong đó @CNT là 2, 3, 4, v.v. không đạt được mục đích và cũng kết thúc bằng lỗi cho biết đã tìm nạp nhiều cột

Tôi có thể không sử dụng biến @CNT trong điều kiện if như trên không?


sql-server-Generalsql-server-transact-sqlsql-server-reporting-services

hình ảnh. png (55. 6 KiB)

Bình luận

Hiển thị nhận xét 0

Bình luận

5. Cần 1600 ký tự còn lại ký tự

  • Hiển thị cho tất cả người dùng
  • Hiển thị với người đăng gốc & Microsoft
  • Người kiểm duyệt có thể xem
  • Có thể xem bởi người kiểm duyệt và người đăng gốc
  • Khả năng hiển thị nâng cao
Chuyển đổi chế độ hiển thị Nhận xét. Hiển thị hiện tại. Hiển thị với tất cả người dùng

tệp đính kèm. Có thể sử dụng tối đa 10 tệp đính kèm (bao gồm cả hình ảnh) với tối đa 3. 0 MiB mỗi cái và 30. tổng cộng 0 MiB

OlafHelper-2800 đã trả lời Ngày 14 tháng 10 năm 20 | CharanP-5854 đã nhận xét Ngày 14 tháng 10 năm 20

Truy vấn của bạn không bị lỗi ở điều kiện IF, nó sẽ bị lỗi sau đó trong câu lệnh CẬP NHẬT với truy vấn phụ; .
Nếu không biết thiết kế bảng, dữ liệu hiện có và logic nghiệp vụ thì rất khó để hỗ trợ tại đây.

Bình luận

Nhận xét · Hiển thị 1

Bình luận

5. Cần 1600 ký tự còn lại ký tự

  • Hiển thị cho tất cả người dùng
  • Hiển thị với người đăng gốc & Microsoft
  • Người kiểm duyệt có thể xem
  • Có thể xem bởi người kiểm duyệt và người đăng gốc
  • Khả năng hiển thị nâng cao
Chuyển đổi chế độ hiển thị Nhận xét. Hiển thị hiện tại. Hiển thị với tất cả người dùng

tệp đính kèm. Có thể sử dụng tối đa 10 tệp đính kèm (bao gồm cả hình ảnh) với tối đa 3. 0 MiB mỗi cái và 30. tổng cộng 0 MiB

Mysql chọn số lượng vào biến
CharanP-5854 · 14 tháng 10 năm 2020 lúc 10. 29 giờ sáng

Xin chào @OlafHelper-2800,

Ví dụ, tôi đang gặp sự cố - COSTCO có nhiều hơn 1 số lượng nhưng nó cũng đang được cập nhật trong bảng 2, nơi tôi đang cố gắng cập nhật chỉ cho một lần xuất hiện như ở trên

0 Phiếu bầu 0 ·

MelissaMa-msft đã trả lời Ngày 14 tháng 10 năm 20 | MelissaMa-msft đã chỉnh sửa 14 tháng 10, '20

Xin chào @CharanP-5854,

Sẽ tốt hơn nếu bạn cung cấp các câu lệnh CREATE TABLE cho các bảng của mình (TABLE1 và TABLE2) cùng với các câu lệnh INSERT với dữ liệu mẫu, đủ để minh họa mọi khía cạnh của vấn đề. Chúng ta cũng cần xem kết quả mong đợi của mẫu

Bạn sẽ làm gì nếu số đếm(COL1) > 1 hoặc <1 hoặc =1?

Tôi đã tạo một ví dụ từ phía tôi. Bạn có thể kiểm tra xem nó có hữu ích cho bạn không

 drop table if exists [TABLE1]
 drop table if exists [TABLE2]
    
 create table [TABLE1]
 ([COL1] varchar(20),
 COL2 varchar(20),
 [DATE1] date
 )
    
 create table [TABLE2]
 (
 col1 varchar(20),
 [HDR1] varchar(20)
 )
    
 insert into [TABLE1] values 
 ('a','aa','2020-10-10'),
 ('b','bb','2020-09-10'),
 ('c','cc','2020-08-10')
    
 insert into [TABLE2]([HDR1])  values
 ('aa'),
 ('bb')
    
 select * from [TABLE1]
    
 select * from [TABLE2]

đầu ra

 COL1 COL2 DATE1
 a aa 2020-10-10
 b bb 2020-09-10
 c cc 2020-08-10
    
 col1 HDR1
 NULL aa
 NULL bb

Sau đó, chúng tôi có thể tiến hành cập nhật TABLE2 bất kể số lượng là bao nhiêu

 UPDATE T
 SET T.[COL1] = T2.[COL1]
 FROM [DBO].TABLE2 T
 JOIN [DBO].TABLE1 T2
 ON LOWER(T.[HDR1]) = LOWER(T2.COL2)
 WHERE T2.[COL1] <> ' ' AND (T2.COL2) <> ' '
 AND T2.[DATE1] >= DATEADD(MONTH, -3, GETDATE())
 AND T2.[DATE1] < GETDATE()

 select * from [TABLE2]

đầu ra

 col1 HDR1
 a aa
 b bb

Trân trọng
Melissa


Nếu câu trả lời hữu ích, vui lòng nhấp vào "Chấp nhận câu trả lời" và bình chọn cho câu trả lời đó.
Lưu ý. Vui lòng làm theo các bước trong tài liệu của chúng tôi để bật thông báo qua e-mail nếu bạn muốn nhận thông báo qua email liên quan cho chủ đề này.

Bình luận

Hiển thị nhận xét 0

Bình luận

5. Cần 1600 ký tự còn lại ký tự

  • Hiển thị cho tất cả người dùng
  • Hiển thị với người đăng gốc & Microsoft
  • Người kiểm duyệt có thể xem
  • Có thể xem bởi người kiểm duyệt và người đăng gốc
  • Khả năng hiển thị nâng cao
Chuyển đổi chế độ hiển thị Nhận xét. Hiển thị hiện tại. Hiển thị với tất cả người dùng

tệp đính kèm. Có thể sử dụng tối đa 10 tệp đính kèm (bao gồm cả hình ảnh) với tối đa 3. 0 MiB mỗi cái và 30. tổng cộng 0 MiB

MelissaMa-msft đã trả lời Ngày 14 tháng 10 năm 20 | MelissaMa-msft đã chỉnh sửa 14 tháng 10, '20

Xin chào @CharanP-5854,

Bạn cũng có thể tham khảo bên dưới

 DECLARE @CNT INT
    
 SELECT @CNT = CNT FROM
 (
 SELECT COUNT(T2.[COL1]) CNT
 FROM [DBO].[TABLE1] T2
 JOIN [DBO].TABLE2 T
 ON LOWER(T.[HDR1]) = LOWER(T2.COL2)
 WHERE T2.[COL1] <> ' ' AND (T2.COL2) <> ' '
 AND T2.[DATE1] >= DATEADD(MONTH, -3, GETDATE())
 AND T2.[DATE1] < GETDATE()
 ) DERIVEDTABLE
    
 IF @CNT >= 1 
 BEGIN
 UPDATE T
 SET T.[COL1] = T2.[COL1]
 FROM [DBO].TABLE2 T
 JOIN [DBO].TABLE1 T2
 ON LOWER(T.[HDR1]) = LOWER(T2.COL2)
 WHERE T2.[COL1] <> ' ' AND (T2.COL2) <> ' '
 AND T2.[DATE1] >= DATEADD(MONTH, -3, GETDATE())
 AND T2.[DATE1] < GETDATE()
 END

Trân trọng
Melissa


Nếu câu trả lời hữu ích, vui lòng nhấp vào "Chấp nhận câu trả lời" và bình chọn cho câu trả lời đó.
Lưu ý. Vui lòng làm theo các bước trong tài liệu của chúng tôi để bật thông báo qua e-mail nếu bạn muốn nhận thông báo qua email liên quan cho chủ đề này.

Bình luận

Hiển thị nhận xét 0

Bình luận

5. Cần 1600 ký tự còn lại ký tự

  • Hiển thị cho tất cả người dùng
  • Hiển thị với người đăng gốc & Microsoft
  • Người kiểm duyệt có thể xem
  • Có thể xem bởi người kiểm duyệt và người đăng gốc
  • Khả năng hiển thị nâng cao
Chuyển đổi chế độ hiển thị Nhận xét. Hiển thị hiện tại. Hiển thị với tất cả người dùng

tệp đính kèm. Có thể sử dụng tối đa 10 tệp đính kèm (bao gồm cả hình ảnh) với tối đa 3. 0 MiB mỗi cái và 30. tổng cộng 0 MiB

Stefan Hoffmann đã trả lời Ngày 14 tháng 10 năm 20 . Stefan Hoffmann đã chỉnh sửa Ngày 14 tháng 10 năm 20

Vấn đề, như Olaf đã chỉ ra, là do truy vấn con của bạn trả về nhiều hơn một hàng.
NẾU không thành công, do bạn sử dụng sai giá trị COUNT().

CẬP NHẬT yêu cầu COUNT(*) = 1.
Nhưng bạn đã sử dụng COUNT(columName), hàm trả về số lượng giá trị khác null trong cột đó có giá trị trùng lặp. btw, điều này tương đương với COUNT(ALL columnName).

 DECLARE @Sample TABLE (
     Payload INT
 );
    
 INSERT INTO @Sample ( Payload )
 VALUES ( NULL ) ,
        ( 0 ) ,
        ( 1 ) ,
        ( 1 );
    
 SELECT COUNT(*) ,
        COUNT(S.Payload) ,
        COUNT(ALL S.Payload) ,
        COUNT(DISTINCT S.Payload)
 FROM   @Sample S;

Mysql chọn số lượng vào biến

Xem thêm COUNT (Transact-SQL)

tôi sẽ kiểm tra một cái gì đó như thế này

 WITH Counted
 AS ( SELECT T2.[COL1] AS Dst ,
             T1.[COL1] AS Src ,
             COUNT(*) OVER () AS Cnt
      FROM   [dbo].TABLE2 T2
             INNER JOIN [dbo].TABLE1 T1 ON LOWER(T2.[HDR1]) = LOWER(T1.COL2)
      WHERE  T1.[COL1] <> ' '
             AND T1.COL2 <> ' '
             AND T1.[DATE1] >= DATEADD(MONTH, -3, GETDATE())
             AND T1.[DATE1] < GETDATE())
 UPDATE C
 SET    C.Dst = C.Src
 FROM   Counted C
 WHERE  C.Cnt = 1;

Tùy thuộc vào trường hợp sử dụng và ngữ cảnh của bạn, tôi sẽ cân nhắc sử dụng COLLATE thay vì LOWER().




hình ảnh. png (3. 8 KiB)

Bình luận

Hiển thị nhận xét 0

Bình luận

5. Cần 1600 ký tự còn lại ký tự

  • Hiển thị cho tất cả người dùng
  • Hiển thị với người đăng gốc & Microsoft
  • Người kiểm duyệt có thể xem
  • Có thể xem bởi người kiểm duyệt và người đăng gốc
  • Khả năng hiển thị nâng cao
Chuyển đổi chế độ hiển thị Nhận xét. Hiển thị hiện tại. Hiển thị với tất cả người dùng

tệp đính kèm. Có thể sử dụng tối đa 10 tệp đính kèm (bao gồm cả hình ảnh) với tối đa 3. 0 MiB mỗi cái và 30. tổng cộng 0 MiB

MelissaMa-msft đã trả lời Ngày 15 tháng 10 năm 20 | MelissaMa-msft đã nhận xét Ngày 28 tháng 10 năm 20

Xin chào @CharanP-5854,

Vui lòng cung cấp các câu lệnh CREATE TABLE cho các bảng của bạn cùng với các câu lệnh INSERT với dữ liệu mẫu thay vì chỉ cung cấp một ảnh chụp nhanh vì tất cả những người trợ giúp cần dành nhiều thời gian để tạo và chèn các bảng này

Tôi vẫn còn một số lo ngại về yêu cầu của bạn. Vui lòng kiểm tra giúp

  1. Trong truy vấn của bạn, ngày 1 phải là trong 3 tháng qua. Ví dụ: 'Amazon. com' có ngày là '2020-07-01' nhưng xuất hiện trong đầu ra mong muốn của bạn

  2. Làm thế nào để tính số đếm và đánh giá số đếm là 1?

Tôi đã cố gắng nhận xét điều kiện của date1 trong 3 tháng qua trong truy vấn và thực hiện một số sửa đổi đối với truy vấn của bạn

Tôi có thể nhận được kết quả giống như trong ảnh chụp nhanh của bạn. Bạn có thể kiểm tra xem nó có hữu ích cho bạn không

 drop table if exists [TABLE1]
 drop table if exists [TABLE2]
    
 create table [TABLE1]
 (Retails varchar(100),
 Products varchar(100),
 [DATE1] date
 )
    
 create table [TABLE2]
 (
 Products varchar(100),
 Retails varchar(100)
 )
    
 insert into [TABLE1] values 
 ('Walmart','Vegetables','2019-11-10'),
 ('Amazon.com','Bakery fresh','2020-07-01'),
 ('The Kroger Co.','Snaks & candy','2020-8-1'),
 ('Costco','Meat &Seafood','2020-08-08'),
 ('Walmart','Clothes','2020-09-25'),
 ('Costco','Vegetables','2020-09-25'),
 ('Costco','Bakery fresh','2020-08-08'),
 ('Costco','Snaks & candy','2020-09-25'),
 ('Costco','Meat &Seafood','2020-08-08'),
 ('Costco','Clothes','2020-08-08'),
 ('Walgreens Boots Alliance','Clothes','2020-07-18'),
 ('Dollar General','Clothes','2020-06-18'),
 ('Dollar General','Bakery fresh','2020-07-20')
    
 insert into [TABLE2](Products)  values
 ('Vegetables'),
 ('Bakery fresh'),
 ('Snaks & candy'),
 ('Meat &Seafood'),
 ('Clothes'),
 ('Vegetables'),
 ('Bakery fresh'),
 ('Snaks & candy'),
 ('Meat &Seafood'),
 ('Clothes'),
 ('Clothes'),
 ('Clothes'),
 ('Bakery fresh')
    
 ;with cte as (
 SELECT T1.[Retails],COUNT(T1.[Retails]) CNT
 FROM [DBO].[TABLE1] T1
 WHERE T1.[Retails] <> ' ' AND (T1.Products) <> ' '
 --AND T1.[DATE1] >= DATEADD(MONTH, -3, GETDATE())
 --AND T1.[DATE1] < GETDATE()
 GROUP BY T1.[Retails]
 ) 
 , cte2 as 
 (
 select Retails,Products 
 from [DBO].[TABLE1] 
 where Retails in (select Retails from cte where cnt=1)
 and [Retails] <> ' ' AND (Products) <> ' '
 --AND [DATE1] >= DATEADD(MONTH, -3, GETDATE())
 --AND [DATE1] < GETDATE()
 )
 ,cte3 as (
 select Products,count(Products) count from cte2
 group by Products)
    
 UPDATE T2
 SET T2.[Retails] = T1.Retails
 FROM [DBO].TABLE2 T2
 JOIN cte2 T1
 ON LOWER(T2.Products) = LOWER(T1.Products)
 inner join cte3 t3
 on t3.Products=t2.Products
 where t3.count=1
    
 select * from [TABLE2]

đầu ra

________số 8

Trân trọng
Melissa


Nếu câu trả lời hữu ích, vui lòng nhấp vào "Chấp nhận câu trả lời" và bình chọn cho câu trả lời đó.
Lưu ý. Vui lòng làm theo các bước trong tài liệu của chúng tôi để bật thông báo qua e-mail nếu bạn muốn nhận thông báo qua email liên quan cho chủ đề này.

Bình luận

Nhận xét · Hiển thị 5

Bình luận

5. Cần 1600 ký tự còn lại ký tự

  • Hiển thị cho tất cả người dùng
  • Hiển thị với người đăng gốc & Microsoft
  • Người kiểm duyệt có thể xem
  • Có thể xem bởi người kiểm duyệt và người đăng gốc
  • Khả năng hiển thị nâng cao
Chuyển đổi chế độ hiển thị Nhận xét. Hiển thị hiện tại. Hiển thị với tất cả người dùng

tệp đính kèm. Có thể sử dụng tối đa 10 tệp đính kèm (bao gồm cả hình ảnh) với tối đa 3. 0 MiB mỗi cái và 30. tổng cộng 0 MiB

Mysql chọn số lượng vào biến
MelissaMa-msft · 16/10/2020 lúc 12. 54 giờ sáng

Xin chào @CharanP-5854,

Bạn có thể vui lòng xác thực truy vấn trên xem nó có hữu ích hay không và cung cấp bất kỳ bản cập nhật nào?

Hãy nhớ chấp nhận câu trả lời nếu họ giúp. Hành động của bạn sẽ hữu ích cho những người dùng khác gặp vấn đề tương tự và đọc chủ đề này.  

Cảm ơn bạn đa hiểu


Trân trọng
Melissa

0 Phiếu bầu 0 ·

CharanP-5854 MelissaMa-msft · 16/10/2020 lúc 12. 03 giờ chiều

Chào Melissa,

Đã thử nó không hoạt động trong tất cả các kịch bản, vì vậy tôi đang cố gắng khắc phục. Một trong những giải pháp tôi tìm thấy là trong truy vấn trên cùng với tất cả các truy vấn để thêm có @count =1 ;

0 Phiếu bầu 0 ·

MelissaMa-msft CharanP-5854 · 20/10/2020 lúc 06. 01 giờ sáng

Xin chào @CharanP-5854,

Sẽ tốt hơn nếu bạn cung cấp thêm chi tiết về các tình huống không hoạt động để chúng tôi có thể kiểm tra thêm

Làm cách nào để đặt số đếm thành một biến trong MySQL?

Có hai cách để gán giá trị cho biến do người dùng xác định. Bạn có thể sử dụng một trong hai. = hoặc = là toán tử gán trong câu lệnh SET . Ví dụ câu lệnh gán số 100 cho biến @counter. Cách thứ hai để gán giá trị cho một biến là sử dụng câu lệnh SELECT.

Làm cách nào để lưu trữ kết quả truy vấn MySQL trong một biến?

Để lưu trữ kết quả truy vấn trong một hoặc nhiều biến, bạn sử dụng cú pháp biến SELECT INTO. .
CHỌN c1, c2, c3,. .
CHỌN thành phố VÀO @city TỪ khách hàng WHERE customerNumber = 103;
Lựa chọn thành phố;
CHỌN thành phố, quốc gia VÀO @city, @country TỪ khách hàng WHERE customerNumber = 103;
CHỌN @city, @country;

Làm cách nào để lưu trữ giá trị đếm trong biến trong PHP?

Trả lời. Sử dụng hàm đếm() hoặc sizeof() của PHP . Hàm count() và sizeof() trả về 0 cho một biến đã được khởi tạo với một mảng trống, nhưng nó cũng có thể trả về 0 cho một biến không được đặt.

Làm cách nào để khai báo hai biến trong MySQL?

MySQL cho phép bạn khai báo hai hoặc nhiều biến có cùng kiểu dữ liệu bằng cách sử dụng một câu lệnh DECLARE. .
Đầu tiên, chỉ định tên của biến sau từ khóa DECLARE. .
Thứ hai, chỉ định loại dữ liệu và độ dài của biến